86浏览
查看: 86|回复: 2

[项目] 【Arduino 动手做】Arduino环境监测温度、湿度和气压

[复制链接]
使用 Windows 10 和 Azure 监控温度、湿度、气压和其他因素的廉价黑客。

该项目由 Arduino、UWP 应用和 Azure 服务组成。

Arduino 通过 HTTP 将其所有数据发送到应用服务实例,该实例将其存储在数据库(简单表)中,并使用应用服务 SDK 在 UWP 应用上检索记录。

由于我基于 AVR 的 mega 对于 TLS 来说太慢了,并且没有空间放置证书,因此我不得不选择 HTTP。

我考虑过使用 MQTT - 但我没有找到任何用 C# 编写的文档齐全的代理,然后查看了 CoAP,当我意识到应用程序服务仅用于端口 80 和 443 上的 HTTP 流量时。

Json 不是最有效的数据传输,似乎是一种疯狂的方法。但它达到了目标性能,也表明所有事情总有一个快速的破解。

如果您有足够的经验,那么您可以在不到 6 小时的时间内完成所有设置(减去传感器等),因为使用“简单表”非常简单(因为它有一个 http api),并且将 SDK 用于 UWP 应用程序(使用像 C# 这样的精彩语言)也很容易。而且您不必处理编组等问题,因为 arduino 和 .net 上的 json 库都易于使用,允许灵活的模式。

【Arduino 动手做】Arduino环境监测温度、湿度和气压图1


【Arduino 动手做】Arduino环境监测温度、湿度和气压图2

【Arduino 动手做】Arduino环境监测温度、湿度和气压图3

【Arduino 动手做】Arduino环境监测温度、湿度和气压图5

【Arduino 动手做】Arduino环境监测温度、湿度和气压图8

【Arduino 动手做】Arduino环境监测温度、湿度和气压图7

【Arduino 动手做】Arduino环境监测温度、湿度和气压图4

【Arduino 动手做】Arduino环境监测温度、湿度和气压图6

驴友花雕  中级技神
 楼主|

发表于 昨天 20:48

【Arduino 动手做】Arduino环境监测温度、湿度和气压

项目代码

  1. /*
  2. Name:                ArduinoEM.ino
  3. Created:        18-Mar-16 21:16:40
  4. Author:        Prajay
  5. */
  6. #include <SharpDust.h>
  7. #include <DSM501.h>
  8. #include <ArduinoJson.h>
  9. #include <Si7021.h>
  10. #include <TSL2561.h>
  11. #include <EEPROM.h>
  12. #include <SPI.h>
  13. #include <Wire.h>
  14. #include <Adafruit_BMP085.h>
  15. #include <Si7021.h>
  16. #include <SFE_CC3000.h>
  17. #include <SFE_CC3000_Client.h>
  18. const int CC3000_INT = 2;      //D2 on Mega2560. CC3000 INTERRUPT pin
  19. const int CC3000_EN = 49;     //D49 on Mega2560. CC3000 ENABLE pin. Can be any Digitial pin.
  20. const int CC3000_CS = 53;                //D53(Hardware SPI Chip Select) on Mega2560. CC3000 Chip Select pin.
  21. const int MQ2_AO = 54;     //A0 on Mega2560.
  22. const int MQ3_AO = 55;     //A1 on Mega2560.
  23. const int MQ4_AO = 56;     //A2 on Mega2560.
  24. const int MQ5_AO = 57;     //A3 on Mega2560.
  25. const int MQ6_AO = 58;     //A4 on Mega2560.
  26. const int MQ7_AO = 59;     //A5 on Mega2560.
  27. const int MQ8_AO = 60;     //A6 on Mega2560.
  28. const int MQ9_AO = 61;     //A7 on Mega2560.
  29. const int MQ135_AO = 62;     //A8 on Mega2560.
  30. const int ML8511_AO = 63;     //A9 on Mega2560.
  31. const int SHARP_AO = 64;     //A10 on Mega2560. GP2Y1010AU0F Pin 5.
  32. const int SHARP_LED = 3;      //D3 (PWM) on Mega2560. GP2Y1010AU0F Pin 3.
  33. const int DSM501A_DO_PM1 = 4;      //D4 (PWM) on Mega2560. DSM501A Pin 2 (PM1 - not PM10)
  34. const int DSM501A_DO_PM25 = 5;      //D5 (PWM) on Mega2560. DSM501A Pin 4 (PM2.5)
  35. const int SENSE_3V3 = 65;     //A11 on Mega2560. For precise voltage reference for 3V3 sensors.
  36. const int TIMEOUT = 30000;  //Wifi/http timeout
  37. const int ERR_HEAP_SIZE = 256;    //(n)bytes = 256 errors per 5 minutes(or whatever upload frequency), do not go over 512 to avoid CC3000 buffer overflow
  38. const int maxCount = 300;    //Max number of samples
  39. const char table_name[] = "WeatherDataItem"; //
  40. const char server[] = "arduinoem.azurewebsites.net";  // too long, might try concat on load, but that'll defeat its purpose
  41. const int START_ADDRESS = 0;
  42. const byte EEPROM_END_MARK = 0;
  43. int device_id = 1;
  44. boolean USBData = false;                   //Is data over USB enabled
  45. boolean BTData = false;                    //Is data over Bluetooth enabled
  46. boolean wifiConnected;             //Is CC3000 connected to a wifi AP
  47. char buffer[1536];                 //HTTP client buffer
  48. int nextEEPROMaddress;
  49. int deviceId = 0;                  //To avoid conflicts when building a newtork of such devices
  50. unsigned long lastMillis_data;
  51. unsigned long lastMillis_sample;
  52. unsigned long lastMillis_send;
  53. int dsmCount = 0;
  54. int count = 0; // Current sampling count
  55. float mq2_min = 1024, mq3_min = 1024, mq4_min = 1024, mq5_min = 1024, mq6_min = 1024, mq7_min = 1024, mq8_min = 1024, mq9_min = 1024, mq135_min = 1024, humidity_min = 1024, temperature_min = 1024, lux_min = 1024, uvb_min = 1024, pressure_min = 1024, dust_min = 1024, dust1_min = 1024, dust25_min = 1024;        // Minimum stored value for current sample period. NOTE  : use non zero initial value, high enough
  56. float mq2_max = 0, mq3_max = 0, mq4_max = 0, mq5_max = 0, mq6_max = 0, mq7_max = 0, mq8_max = 0, mq9_max = 0, mq135_max = 0, humidity_max = 0, temperature_max = 0, lux_max = 0, uvb_max = 0, pressure_max = 0, dust_max = 0, dust1_max = 0, dust25_max = 0;        // Average value once divided by count, since it gets added to sample
  57. float mq2_avg = 0, mq3_avg = 0, mq4_avg = 0, mq5_avg = 0, mq6_avg = 0, mq7_avg = 0, mq8_avg = 0, mq9_avg = 0, mq135_avg = 0, humidity_avg = 0, temperature_avg = 0, lux_avg = 0, uvb_avg = 0, pressure_avg = 0, dust_avg = 0, dust1_avg = 0, dust25_avg = 0;        // Minimum stored value for current sample period
  58. char err[ERR_HEAP_SIZE] = ""; // initialze with \0 for sanity
  59. // store last n errors until every wifi request (per 5 mins default), initialize with null terminator
  60. // A = Wifi EEPROM add fail
  61. // E = EEPROM fail
  62. // W = Wifi
  63. // C = Credential/Connection Info
  64. // S = BMP180
  65. // J = jsonobject send to azure fail
  66. // U = USB data send fail
  67. // B = BT data send fail
  68. //1 MQ2
  69. //2 MQ3
  70. //3 MQ4
  71. //4 MQ5
  72. //6 MQ7
  73. //7 MQ8
  74. //8 MQ9
  75. //9 MQ135
  76. //D DSM501A
  77. //G Sharp GP2y... dust sensor
  78. SFE_CC3000 wifi = SFE_CC3000(CC3000_INT, CC3000_EN, CC3000_CS); // Object reference to the wifi module
  79. SFE_CC3000_Client client = SFE_CC3000_Client(wifi); // Object reference to http client
  80. //#define      WLAN_SEC_UNSEC (0)
  81. //#define      WLAN_SEC_WEP  (1)
  82. //#define      WLAN_SEC_WPA (2)
  83. //#define      WLAN_SEC_WPA2  (3)
  84. DSM501 dsm501(DSM501A_DO_PM1, DSM501A_DO_PM25);
  85. SI7021 si7021; // Object Referece to si7021 sensor
  86. Adafruit_BMP085 bmp; // Object Reference to bmp180 sensor
  87. TSL2561 tsl(TSL2561_ADDR_FLOAT); // Object reference to TSL2561 sensor
  88. void sampleData()
  89. {
  90.         count++;
  91.         float uvb = readUVB();
  92.         if (uvb > uvb_max)
  93.         {
  94.                 uvb_max = uvb;
  95.         }
  96.         if (uvb < uvb_min)
  97.         {
  98.                 uvb_min = uvb;
  99.         }
  100.         uvb_avg += uvb;
  101.         sampleIICSensors();
  102.         sampleGasSensors();
  103.         sampleDustSensors();
  104. }
  105. void sendSampledData()
  106. {
  107.         sendDataWifi(err, mq2_min, mq2_max, (mq2_avg / count), mq3_min, mq3_max, (mq3_avg / count), mq4_min, mq4_max,
  108.                 (mq4_avg / count), mq5_min, mq5_max, (mq5_avg / count), mq6_min, mq6_max, (mq6_avg / count),
  109.                 mq7_min, mq7_max, (mq7_avg / count), mq8_min, mq8_max, (mq8_avg / count),
  110.                 mq9_min, mq9_max, (mq9_avg / count), mq135_min, mq135_max, (mq135_avg / count),
  111.                 temperature_min, temperature_max, (temperature_avg / count),
  112.                 humidity_min, humidity_max, (humidity_avg / count), lux_min, lux_max, (lux_avg / count),
  113.                 uvb_min, uvb_max, (uvb_avg / count), pressure_min, pressure_max, (pressure_avg / count),
  114.                 dust_min, dust_max, (dust_avg / count), dust25_min, dust25_max, (dust25_avg / dsmCount),
  115.                 dust1_min, dust1_max, (dust1_avg / dsmCount));
  116.         delay(75);
  117.         //reset all variables
  118.         count = 0;
  119.         mq2_min = 1024; mq3_min = 1024; mq4_min = 1024; mq5_min = 1024; mq6_min = 1024; mq7_min = 1024; mq8_min = 1024; mq9_min = 1024; mq135_min = 1024; humidity_min = 1024; temperature_min = 1024; lux_min = 1024; uvb_min = 1024; pressure_min = 1024; dust_min = 1024; dust1_min = 1024; dust25_min = 1024;
  120.         mq2_max = 0; mq3_max = 0; mq4_max = 0; mq5_max = 0; mq6_max = 0; mq7_max = 0; mq8_max = 0; mq9_max = 0; mq135_max = 0; humidity_max = 0; temperature_max = 0; lux_max = 0; uvb_max = 0; pressure_max = 0; dust_max = 0; dust1_max = 0; dust25_max = 0;
  121.         mq2_avg = 0; mq3_avg = 0; mq4_avg = 0; mq5_avg = 0; mq6_avg = 0; mq7_avg = 0; mq8_avg = 0; mq9_avg = 0; mq135_avg = 0; humidity_avg = 0; temperature_avg = 0; lux_avg = 0; uvb_avg = 0; pressure_avg = 0; dust_avg = 0; dust1_avg = 0; dust25_avg = 0;
  122. }
  123. void sampleDustSensors()
  124. {
  125.         float dust = readDust();
  126.         if (dust == 0 )
  127.         {
  128.                 dust = readDust();
  129.         }
  130.         if (dust > dust_max || dust_max == 0)
  131.         {
  132.                 dust_max = dust;
  133.         }
  134.         if (dust < dust_min || dust_min == 1024)
  135.         {
  136.                 dust_min = dust;
  137.         }
  138.         dust_avg += dust;
  139.         if (count == 1||count % 5 == 0) // sample dsm every 5 normal samples, since minimum time is 30s, also do it on first sample
  140.         {
  141.                 dsm501.update();
  142.                 float dust1 = dsm501.getParticleWeight(0), dust25 = dsm501.getParticleWeight(1);
  143.                 if (dust1 != 0 && dust25 != 0)
  144.                 {
  145.                         dsmCount++;
  146.                         if (dust1 > dust1_max || dust1_max == 0)
  147.                         {
  148.                                 dust1_max = dust1;
  149.                         }
  150.                         if (dust1 < dust1_min || dust1_min == 1024)
  151.                         {
  152.                                 dust1_min = dust1;
  153.                         }
  154.                         if (dust25 > dust25_max || dust25_max == 0)
  155.                         {
  156.                                 dust25_max = dust25;
  157.                         }
  158.                         if (dust25 < dust25_min || dust25_min == 1024)
  159.                         {
  160.                                 dust25_min = dust25;
  161.                         }
  162.                         dust1_avg += dust1;
  163.                         dust25_avg += dust25;
  164.                 }
  165.         }
  166. }
  167. //Samples I2C sensors
  168. //To be called from another function only
  169. void sampleIICSensors()
  170. {
  171.         float temperature = readTemperature(), pressure = readPressure(), humidity = readHumidity(), lux = readLux();
  172.         if (temperature > temperature_max)
  173.         {
  174.                 temperature_max = temperature;
  175.         }
  176.         if (temperature < temperature_min || temperature_min == 1024)
  177.         {
  178.                 temperature_min = temperature;
  179.         }
  180.         if (humidity > humidity_max)
  181.         {
  182.                 humidity_max = humidity;
  183.         }
  184.         if (humidity < humidity_min)
  185.         {
  186.                 humidity_min = humidity;
  187.         }
  188.         if (pressure > pressure_max)
  189.         {
  190.                 pressure_max = pressure;
  191.         }
  192.         if (pressure < pressure_min || pressure_min == 1024)
  193.         {
  194.                 pressure_min = pressure;
  195.         }
  196.         if (lux > lux_max)
  197.         {
  198.                 lux_max = lux;
  199.         }
  200.         if (lux < lux_min)
  201.         {
  202.                 lux_min = lux;
  203.         }
  204.         temperature_avg += temperature; pressure_avg += pressure;
  205.         humidity_avg += humidity; lux_avg += lux;
  206. }
  207. //Samples the analog data for the gas sensors.
  208. //To be called from another function only
  209. void sampleGasSensors()
  210. {
  211.         //They are powered by a Switch mode power supply, therefore need avergaign to reduce noise spikes
  212.         float mq2 = averageAnalogRead(MQ2_AO), mq3 = averageAnalogRead(MQ3_AO), mq4 = averageAnalogRead(MQ4_AO), mq5 = averageAnalogRead(MQ6_AO), mq6 = averageAnalogRead(MQ6_AO),
  213.                 mq7 = averageAnalogRead(MQ7_AO), mq8 = averageAnalogRead(MQ8_AO), mq9 = averageAnalogRead(MQ9_AO), mq135 = averageAnalogRead(MQ135_AO);
  214.         if (mq2 > mq2_max || mq2_max == 0)
  215.         {
  216.                 mq2_max = mq2;
  217.         }
  218.         if (mq2 < mq2_min || mq2_min == 1024)
  219.         {
  220.                 mq2_min = mq2;
  221.         }
  222.         if (mq3 > mq3_max || mq3_max == 0)
  223.         {
  224.                 mq3_max = mq3;
  225.         }
  226.         if (mq3 < mq3_min || mq3_min == 1024)
  227.         {
  228.                 mq3_min = mq3;
  229.         }
  230.         if (mq4 > mq4_max || mq4_max == 0)
  231.         {
  232.                 mq4_max = mq4;
  233.         }
  234.         if (mq4 < mq4_min || mq4_min == 1024)
  235.         {
  236.                 mq4_min = mq4;
  237.         }
  238.         if (mq5 > mq5_max || mq5_max == 0)
  239.         {
  240.                 mq5_max = mq5;
  241.         }
  242.         if (mq5 < mq5_min || mq5_min == 1024)
  243.         {
  244.                 mq5_min = mq5;
  245.         }
  246.         if (mq6 > mq6_max || mq6_max == 0)
  247.         {
  248.                 mq6_max = mq6;
  249.         }
  250.         if (mq6 < mq6_min || mq6_min == 1024)
  251.         {
  252.                 mq6_min = mq6;
  253.         }
  254.         if (mq7 > mq7_max)
  255.         {
  256.                 mq7_max = mq7;
  257.         }
  258.         if (mq7 < mq7_min || mq7_min == 1024)
  259.         {
  260.                 mq7_min = mq7;
  261.         }
  262.         if (mq8 > mq8_max || mq8_max == 0)
  263.         {
  264.                 mq8_max = mq8;
  265.         }
  266.         if (mq8 < mq8_min || mq8_min == 1024)
  267.         {
  268.                 mq8_min = mq8;
  269.         }
  270.         if (mq9 > mq9_max || mq9_max == 0)
  271.         {
  272.                 mq9_max = mq9;
  273.         }
  274.         if (mq9 < mq9_min || mq9_min == 1024)
  275.         {
  276.                 mq9_min = mq9;
  277.         }
  278.         if (mq135 > mq135_max || mq135_max == 0)
  279.         {
  280.                 mq135_max = mq135;
  281.         }
  282.         if (mq135 < mq135_min || mq135_min == 1024)
  283.         {
  284.                 mq135_min = mq135;
  285.         }
  286.         mq2_avg += mq2; mq3_avg += mq3;
  287.         mq4_avg += mq4; mq5_avg += mq5;
  288.         mq6_avg += mq6; mq7_avg += mq7;
  289.         mq8_avg += mq8; mq9_avg += mq9;
  290.         mq135_avg += mq135;
  291. }
  292. //Queries SI7021 and returns the temperature in �C (degrees Celsius)
  293. float readTemperature()
  294. {
  295.         return si7021.readTemp();
  296. }
  297. //Queries SI7021 and returns the relative humidity in % (percentage)
  298. float readHumidity()
  299. {
  300.         return si7021.readHumidity();
  301. }
  302. //Queries BMP180 and returns the pressure in Pa
  303. float readPressure()
  304. {
  305.         return bmp.readPressure();
  306. }
  307. //Queries TSL2561 and returns the calculated lux
  308. float readLux()
  309. {
  310.         return tsl.calculateLux(tsl.getLuminosity(TSL2561_FULLSPECTRUM), tsl.getLuminosity(TSL2561_INFRARED));
  311. }
  312. //Reads uvb from ML8511 sensor
  313. //returns the value in mW/cm^2
  314. float readUVB()
  315. {
  316.         float uvLevel = averageAnalogRead(ML8511_AO);
  317.         float refLevel = 675.18 ;//averageAnalogRead(SENSE_3V3);
  318.         float outputVoltage = 3.3 / refLevel * uvLevel;
  319.         float uvIntensity = mapfloat(outputVoltage, 0.99, 2.8, 0.0, 15.0);
  320.         return uvIntensity;
  321. }
  322. float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
  323. {
  324.         return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
  325. }
  326. //Reads dust value from Sharp Dust Sensor in//  TODO : unit
  327. float readDust()
  328. {
  329.         return SharpDust.measure();
  330. }
  331. float readDust1()
  332. {
  333.         dsm501.update();
  334.         return dsm501.getParticleWeight(0);
  335. }
  336. float readDust25()
  337. {
  338.         dsm501.update();
  339.         return dsm501.getParticleWeight(1);
  340. }
  341. float averageAnalogRead(int pinToRead)
  342. {
  343.         byte numberOfReadings = 8;
  344.         float runningValue = 0;
  345.         for (int x = 0; x < numberOfReadings; x++)
  346.                 runningValue += analogRead(pinToRead);
  347.         runningValue /= numberOfReadings;
  348.         return(runningValue);
  349. }
  350. //Initializes CC3000 and returns false if it fails to initialize or connect to the stored wifi credentials
  351. boolean initWifi()
  352. {
  353.         if (!wifi.init())
  354.         {
  355.                 strcat(err, "W");
  356.                 return false;
  357.         }
  358.         if (!connectWifi())
  359.         {
  360.                 return false;
  361.         }
  362.         return true;
  363. }
  364. //Connects to wifi using credentials stored in EEPROM, returns true if successful
  365. boolean connectWifi()
  366. {
  367.         if (wifiConnected == 1 && !wifi.disconnect())
  368.         {
  369.                 strcat(err, "C");
  370.                 return false;
  371.         }
  372.         else
  373.         {
  374.                 char *ssid = readEEPROMString(START_ADDRESS, 0);
  375.                 char *password = readEEPROMString(START_ADDRESS, 1);
  376.                 char *sec = readEEPROMString(START_ADDRESS, 2);
  377.                 if (!wifi.connect(ssid, (int)(sec[0] - '0'), password, TIMEOUT))
  378.                 {
  379.                         strcat(err, "C");
  380.                         wifiConnected = false;
  381.                         return false;
  382.                 }
  383.                 wifiConnected = true;
  384.                 return true;
  385.         }
  386. }
  387. //Initializes the I2C devices, returns false if one of them is not initialized (if detectable)
  388. boolean initI2C()
  389. {
  390.         si7021.begin();
  391.         si7021.setHumidityRes(12);
  392.         tsl.begin();
  393.         tsl.setGain(TSL2561_GAIN_16X);
  394.         tsl.setTiming(TSL2561_INTEGRATIONTIME_101MS);
  395.         if (!bmp.begin())
  396.         {
  397.                 strcat(err, "S");
  398.                 return false;
  399.         }
  400.         else
  401.         {
  402.                 return true;
  403.         }
  404. }
  405. //Writes wifi credentials to EEPROM safely,  returns false if operation failed. Look in credits for source
  406. boolean writeWifiEEPROM(char _ssid[], char _password[], char _security[])
  407. {
  408.         nextEEPROMaddress = 0;
  409.         if (addToEEPROM(_ssid) == 1 && addToEEPROM(_password) == 1 && addToEEPROM(_security) == 1)
  410.         {
  411.                 EEPROM.update(nextEEPROMaddress++, EEPROM_END_MARK);
  412.                 return true;
  413.         }
  414.         else
  415.         {
  416.                 strcat(err, "E");
  417.                 return false;
  418.         }
  419. }
  420. //Adds a string to EEPROM, returns false if operation failed. Look in credits for source
  421. boolean addToEEPROM(char *text)
  422. {
  423.         if (nextEEPROMaddress + strlen(text) + 1 > EEPROM.length())
  424.         {
  425.                 strcat(err, "A");
  426.                 return false;
  427.         }
  428.         do
  429.         {
  430.                 EEPROM.update(nextEEPROMaddress++, (byte)*text);
  431.         } while (*text++ != '\0');
  432.         return true;
  433. }
  434. //Returns the string read from EEPROM. Look in credits for source
  435. char *readEEPROMString(int baseAddress, int stringNumber)
  436. {
  437.         int start, length, i, nextAddress;
  438.         char ch;
  439.         char *result;
  440.         nextAddress = START_ADDRESS;
  441.         for (i = 0; i < stringNumber; ++i)
  442.         {
  443.                 ch = (char)EEPROM.read(nextAddress++);
  444.                 if (ch == (char)EEPROM_END_MARK || nextAddress >= EEPROM.length())
  445.                 {
  446.                         return (char *)0;
  447.                 }
  448.                 while (ch != '\0' && nextAddress < EEPROM.length())
  449.                 {
  450.                         ch = EEPROM.read(nextAddress++);
  451.                 }
  452.         }
  453.         start = nextAddress;
  454.         ch = (char)EEPROM.read(nextAddress++);
  455.         if (ch == (char)EEPROM_END_MARK)
  456.         {
  457.                 return (char *)0;
  458.         }
  459.         length = 0;
  460.         while (ch != '\0' && nextAddress < EEPROM.length())
  461.         {
  462.                 ++length;
  463.                 ch = EEPROM.read(nextAddress++);
  464.         }
  465.         result = new char[length + 1];
  466.         nextAddress = start;
  467.         for (i = 0; i < length; ++i)
  468.         {
  469.                 result[i] = (char)EEPROM.read(nextAddress++);
  470.         }
  471.         result[i] = '\0';
  472.         return result;
  473. }
  474. //Wrapper overload method for preserving sanity
  475. //Sends current sensor(not avg!) data and extremes of stored sampled data from last 5 minutes.
  476. // Checks if currently any data is being sent to avoid overflows
  477. // Make sure to call the function using a mills timer
  478. boolean sendDataUSB()
  479. {
  480.         if (USBData)
  481.         {
  482.                 sendDataUSB(err, mq2_min, mq2_max, analogRead(MQ2_AO), mq3_min, mq3_max, analogRead(MQ3_AO), mq4_min, mq4_max, analogRead(MQ4_AO), mq5_min, mq5_max, analogRead(MQ5_AO), mq6_min, mq6_max, analogRead(MQ6_AO), mq7_min, mq7_max, analogRead(MQ7_AO), mq8_min, mq8_max, analogRead(MQ8_AO), mq9_min, mq9_max, analogRead(MQ9_AO), mq135_min, mq135_avg, analogRead(MQ135_AO), temperature_min, temperature_max, readTemperature(), humidity_min, humidity_max, readHumidity(), lux_min, lux_max, readLux(), uvb_min, uvb_max, readUVB(), pressure_min, pressure_max, readPressure(), dust_min, dust_max, readDust(), dust25_min, dust25_max, readDust25(), dust1_min, dust1_max, readDust1());
  483.         }
  484. }
  485. //Wrapper overload method for preserving sanity
  486. //Sends current sensor(not avg!) data and extremes of stored sampled data from last 5 minutes.
  487. // Checks if currently any data is being sent to avoid overflows
  488. // Make sure to call the function using a mills timer
  489. boolean sendDataBT()
  490. {
  491.         if (BTData)
  492.         {
  493.                 sendDataBT(err, mq2_min, mq2_max, analogRead(MQ2_AO), mq3_min, mq3_max, analogRead(MQ3_AO), mq4_min, mq4_max, analogRead(MQ4_AO), mq5_min, mq5_max, analogRead(MQ5_AO), mq6_min, mq6_max, analogRead(MQ6_AO), mq7_min, mq7_max, analogRead(MQ7_AO), mq8_min, mq8_max, analogRead(MQ8_AO), mq9_min, mq9_max, analogRead(MQ9_AO), mq135_min, mq135_avg, analogRead(MQ135_AO), temperature_min, temperature_max, readTemperature(), humidity_min, humidity_max, readHumidity(), lux_min, lux_max, readLux(), uvb_min, uvb_max, readUVB(), pressure_min, pressure_max, readPressure(), dust_min, dust_max, readDust(), dust25_min, dust25_max, (dust25_avg/dsmCount), dust1_min, dust1_max, (dust25_avg/dsmCount));
  494.         }
  495. }
  496. //Constructs a json string sends that string over Serial interface, which is connected to TTL-USB converter by default.
  497. //TODO : This will not work for MQ7
  498. //Returns false if operation fails
  499. boolean sendDataUSB(char _err[], float _mq2_min, float _mq2_max, float _mq2_avg, float _mq3_min, float _mq3_max, float _mq3_avg, float _mq4_min, float _mq4_max, float _mq4_avg, float _mq5_min, float _mq5_max,
  500.         float _mq5_avg, float _mq6_min, float _mq6_max, float _mq6_avg, float _mq7_min, float _mq7_max, float _mq7_avg, float _mq8_min, float _mq8_max, float _mq8_avg, float _mq9_min, float _mq9_max, float _mq9_avg,
  501.         float _mq135_min, float _mq135_max, float _mq135_avg, float _temperature_min, float _temperature_max, float _temperature_avg, float _humidity_min, float _humidity_max, float _humidity_avg, float _lux_min, float _lux_max, float _lux_avg,
  502.         float _uvb_min, float _uvb_max, float _uvb_avg, float _pressure_min, float _pressure_max, float _pressure_avg, float _dust_min, float _dust_max, float _dust_avg, float _dust25_min, float _dust25_max, float _dust25_avg, float _dust1_min, float _dust1_max, float _dust1_avg)
  503. {
  504.         StaticJsonBuffer<1024> jsonBuffer;
  505.         JsonObject& outputObject = jsonBuffer.createObject();
  506.         outputObject["mq2_min"] = _mq2_min; outputObject["mq2_avg"] = _mq2_avg; outputObject["mq2_max"] = _mq2_max; outputObject["mq3_min"] = _mq3_min; outputObject["mq3_avg"] = _mq3_avg; outputObject["mq3_max"] = _mq3_max;
  507.         outputObject["mq4_min"] = _mq4_min; outputObject["mq4_avg"] = _mq4_avg; outputObject["mq4_max"] = _mq4_max; outputObject["mq5_min"] = _mq5_min; outputObject["mq5_avg"] = _mq5_avg; outputObject["mq5_max"] = _mq5_max;
  508.         outputObject["mq6_min"] = _mq6_min; outputObject["mq6_avg"] = _mq6_avg; outputObject["mq6_max"] = _mq6_max; outputObject["mq7_min"] = _mq7_min; outputObject["mq7_avg"] = _mq7_avg; outputObject["mq7_max"] = _mq7_max;
  509.         outputObject["mq8_min"] = _mq8_min; outputObject["mq8_avg"] = _mq8_avg; outputObject["mq8_max"] = _mq8_max; outputObject["mq9_min"] = _mq9_min; outputObject["mq9_avg"] = _mq9_avg; outputObject["mq9_max"] = _mq9_max;
  510.         outputObject["mq135_min"] = _mq135_min; outputObject["mq135_avg"] = _mq135_avg; outputObject["mq135_max"] = _mq135_max; outputObject["deviceId"] = device_id;
  511.         outputObject["temperature_min"] = _temperature_min; outputObject["temperature_avg"] = _temperature_avg; outputObject["temperature_max"] = _temperature_max; outputObject["humidity_min"] = _humidity_min; outputObject["humidity_avg"] = _humidity_avg; outputObject["humidity_max"] = _humidity_max;
  512.         outputObject["lux_min"] = _lux_min; outputObject["lux_avg"] = _lux_avg; outputObject["lux_max"] = _lux_max; outputObject["uvb_min"] = _uvb_min; outputObject["uvb_avg"] = _uvb_avg; outputObject["uvb_max"] = _uvb_max;
  513.         outputObject["err"] = _err; outputObject["pressure_min"] = _pressure_min; outputObject["pressure_max"] = _pressure_max; outputObject["pressure_avg"] = _pressure_avg; outputObject["dust_min"] = _dust_min; outputObject["dust_max"] = _dust_max; outputObject["dust_avg"] = _dust_avg;
  514.         outputObject["dust1_min"] = _dust1_min; outputObject["dust1_max"] = _dust1_max; outputObject["dust1_avg"] = _dust1_avg; outputObject["dust25_min"] = _dust25_min; outputObject["dust25_max"] = _dust25_max; outputObject["dust25_avg"] = _dust25_avg;
  515.         if (!outputObject.printTo(Serial))
  516.         {
  517.                 strcat(err, "U");
  518.                 return false;
  519.         }
  520.         else
  521.         {
  522.                 Serial.write((byte)'\r');
  523.                 Serial.write((byte)'\n');
  524.                 return true;
  525.         }
  526. }
  527. //Constructs a json string sends that string over Serial1 interface, only available on Mega with a TTL bluetooth device connected
  528. //Returns false if operation fails
  529. boolean sendDataBT(char _err[], float _mq2_min, float _mq2_max, float _mq2_avg, float _mq3_min, float _mq3_max, float _mq3_avg, float _mq4_min, float _mq4_max, float _mq4_avg, float _mq5_min, float _mq5_max,
  530.         float _mq5_avg, float _mq6_min, float _mq6_max, float _mq6_avg, float _mq7_min, float _mq7_max, float _mq7_avg, float _mq8_min, float _mq8_max, float _mq8_avg, float _mq9_min, float _mq9_max, float _mq9_avg,
  531.         float _mq135_min, float _mq135_max, float _mq135_avg, float _temperature_min, float _temperature_max, float _temperature_avg, float _humidity_min, float _humidity_max, float _humidity_avg, float _lux_min, float _lux_max, float _lux_avg,
  532.         float _uvb_min, float _uvb_max, float _uvb_avg, float _pressure_min, float _pressure_max, float _pressure_avg, float _dust_min, float _dust_max, float _dust_avg, float _dust25_min, float _dust25_max, float _dust25_avg, float _dust1_min, float _dust1_max, float _dust1_avg)
  533. {
  534.         StaticJsonBuffer<1024> jsonBuffer;
  535.         JsonObject& outputObject = jsonBuffer.createObject();
  536.         outputObject["mq2_min"] = _mq2_min; outputObject["mq2_avg"] = _mq2_avg; outputObject["mq2_max"] = _mq2_max; outputObject["mq3_min"] = _mq3_min; outputObject["mq3_avg"] = _mq3_avg; outputObject["mq3_max"] = _mq3_max;
  537.         outputObject["mq4_min"] = _mq4_min; outputObject["mq4_avg"] = _mq4_avg; outputObject["mq4_max"] = _mq4_max; outputObject["mq5_min"] = _mq5_min; outputObject["mq5_avg"] = _mq5_avg; outputObject["mq5_max"] = _mq5_max;
  538.         outputObject["mq6_min"] = _mq6_min; outputObject["mq6_avg"] = _mq6_avg; outputObject["mq6_max"] = _mq6_max; outputObject["mq7_min"] = _mq7_min; outputObject["mq7_avg"] = _mq7_avg; outputObject["mq7_max"] = _mq7_max;
  539.         outputObject["mq8_min"] = _mq8_min; outputObject["mq8_avg"] = _mq8_avg; outputObject["mq8_max"] = _mq8_max; outputObject["mq9_min"] = _mq9_min; outputObject["mq9_avg"] = _mq9_avg; outputObject["mq9_max"] = _mq9_max;
  540.         outputObject["mq135_min"] = _mq135_min; outputObject["mq135_avg"] = _mq135_avg; outputObject["mq135_max"] = _mq135_max; outputObject["deviceId"] = device_id;
  541.         outputObject["temperature_min"] = _temperature_min; outputObject["temperature_avg"] = _temperature_avg; outputObject["temperature_max"] = _temperature_max; outputObject["humidity_min"] = _humidity_min; outputObject["humidity_avg"] = _humidity_avg; outputObject["humidity_max"] = _humidity_max;
  542.         outputObject["lux_min"] = _lux_min; outputObject["lux_avg"] = _lux_avg; outputObject["lux_max"] = _lux_max; outputObject["uvb_min"] = _uvb_min; outputObject["uvb_avg"] = _uvb_avg; outputObject["uvb_max"] = _uvb_max;
  543.         outputObject["err"] = _err; outputObject["pressure_min"] = _pressure_min; outputObject["pressure_max"] = _pressure_max; outputObject["pressure_avg"] = _pressure_avg; outputObject["dust_min"] = _dust_min; outputObject["dust_max"] = _dust_max; outputObject["dust_avg"] = _dust_avg;
  544.         outputObject["dust1_min"] = _dust1_min; outputObject["dust1_max"] = _dust1_max; outputObject["dust1_avg"] = _dust1_avg; outputObject["dust25_min"] = _dust25_min; outputObject["dust25_max"] = _dust25_max; outputObject["dust25_avg"] = _dust25_avg;
  545.         if (!outputObject.printTo(Serial1))
  546.         {
  547.                 strcat(err, "B");
  548.                 return false;
  549.         }
  550.         else
  551.         {
  552.                 Serial1.write((byte)'\r');
  553.                 Serial1.write((byte)'\n');
  554.                 return true;
  555.         }
  556. }
  557. //Constructs a json string sends that string over Wifi using CC3000
  558. //Returns false if operation fails
  559. boolean sendDataWifi(char _err[], float _mq2_min, float _mq2_max, float _mq2_avg, float _mq3_min, float _mq3_max, float _mq3_avg, float _mq4_min, float _mq4_max, float _mq4_avg, float _mq5_min, float _mq5_max,
  560.         float _mq5_avg, float _mq6_min, float _mq6_max, float _mq6_avg, float _mq7_min, float _mq7_max, float _mq7_avg, float _mq8_min, float _mq8_max, float _mq8_avg, float _mq9_min, float _mq9_max, float _mq9_avg,
  561.         float _mq135_min, float _mq135_max, float _mq135_avg, float _temperature_min, float _temperature_max, float _temperature_avg, float _humidity_min, float _humidity_max, float _humidity_avg, float _lux_min, float _lux_max, float _lux_avg,
  562.         float _uvb_min, float _uvb_max, float _uvb_avg, float _pressure_min, float _pressure_max, float _pressure_avg, float _dust_min, float _dust_max, float _dust_avg, float _dust25_min, float _dust25_max, float _dust25_avg, float _dust1_min, float _dust1_max, float _dust1_avg)
  563. {
  564.         StaticJsonBuffer<1024> jsonBuffer;
  565.         JsonObject& outputObject = jsonBuffer.createObject();
  566.         outputObject["mq2_min"] = _mq2_min; outputObject["mq2_avg"] = _mq2_avg; outputObject["mq2_max"] = _mq2_max; outputObject["mq3_min"] = _mq3_min; outputObject["mq3_avg"] = _mq3_avg; outputObject["mq3_max"] = _mq3_max;
  567.         outputObject["mq4_min"] = _mq4_min; outputObject["mq4_avg"] = _mq4_avg; outputObject["mq4_max"] = _mq4_max; outputObject["mq5_min"] = _mq5_min; outputObject["mq5_avg"] = _mq5_avg; outputObject["mq5_max"] = _mq5_max;
  568.         outputObject["mq6_min"] = _mq6_min; outputObject["mq6_avg"] = _mq6_avg; outputObject["mq6_max"] = _mq6_max; outputObject["mq7_min"] = _mq7_min; outputObject["mq7_avg"] = _mq7_avg; outputObject["mq7_max"] = _mq7_max;
  569.         outputObject["mq8_min"] = _mq8_min; outputObject["mq8_avg"] = _mq8_avg; outputObject["mq8_max"] = _mq8_max; outputObject["mq9_min"] = _mq9_min; outputObject["mq9_avg"] = _mq9_avg; outputObject["mq9_max"] = _mq9_max;
  570.         outputObject["mq135_min"] = _mq135_min; outputObject["mq135_avg"] = _mq135_avg; outputObject["mq135_max"] = _mq135_max; outputObject["deviceId"] = device_id;
  571.         outputObject["temperature_min"] = _temperature_min; outputObject["temperature_avg"] = _temperature_avg; outputObject["temperature_max"] = _temperature_max; outputObject["humidity_min"] = _humidity_min; outputObject["humidity_avg"] = _humidity_avg; outputObject["humidity_max"] = _humidity_max;
  572.         outputObject["lux_min"] = _lux_min; outputObject["lux_avg"] = _lux_avg; outputObject["lux_max"] = _lux_max; outputObject["uvb_min"] = _uvb_min; outputObject["uvb_avg"] = _uvb_avg; outputObject["uvb_max"] = _uvb_max;
  573.         outputObject["err"] = _err; outputObject["pressure_min"] = _pressure_min; outputObject["pressure_max"] = _pressure_max; outputObject["pressure_avg"] = _pressure_avg; outputObject["dust_min"] = _dust_min; outputObject["dust_max"] = _dust_max; outputObject["dust_avg"] = _dust_avg;
  574.         outputObject["dust1_min"] = _dust1_min; outputObject["dust1_max"] = _dust1_max; outputObject["dust1_avg"] = _dust1_avg; outputObject["dust25_min"] = _dust25_min; outputObject["dust25_max"] = _dust25_max; outputObject["dust25_avg"] = _dust25_avg;
  575.         if (client.connect(server, 80))
  576.         {
  577.                 sprintf(buffer, "POST /tables/%s HTTP/1.1", table_name);
  578.                 client.println(buffer);
  579.                 sprintf(buffer, "Host: %s", server);
  580.                 client.println(buffer);
  581.                 client.println("Connection: close"); // No keep alive
  582.                 client.println("ZUMO-API-VERSION: 2.0.0"); // Azure Mobile Services header,not required if your app is configuired not to check version
  583.                 client.println("Content-Type: application/json"); // JSON content type
  584.                 outputObject.printTo(buffer, sizeof(buffer));    // POST body
  585.                 client.print("Content-Length: ");  // Content length
  586.                 client.println(outputObject.measureLength());
  587.                 client.println();
  588.                 client.println(buffer);
  589.                 err[0] = '\0';
  590.                 return true;
  591.         }
  592.         else
  593.         {
  594.                 strcat(err, "J");
  595.                 return false;
  596.         }
  597. }
  598. //Initializes all other electronices
  599. void setup()
  600. {
  601.         pinMode(LED_BUILTIN, OUTPUT);
  602.         digitalWrite(LED_BUILTIN, HIGH);
  603.         nextEEPROMaddress = START_ADDRESS;
  604.         Serial.begin(115200);
  605.         Serial1.begin(115200); // Apparently COM ports on windows only support upto 128000 baud ? and 115200 is the nearest to it which is supported by every module
  606.         //Serial.println("Start setup");
  607.         dsm501.begin(MIN_WIN_SPAN);
  608.         //Serial.println("Initialize samyoung Dust");
  609.         SharpDust.begin(SHARP_LED, SHARP_AO);
  610.         //Serial.println("Initialize Sharp Dust");
  611.         lastMillis_data = millis();
  612.         lastMillis_sample = millis();
  613.         lastMillis_send = millis();
  614.         initWifi();
  615.         //Serial.println("Initialize CC3000");
  616.         initI2C(); // initialize I2C sensors
  617.         //Serial.println("Initialize IIC");
  618.         digitalWrite(LED_BUILTIN, LOW);
  619.         delay(300);
  620.         digitalWrite(LED_BUILTIN, HIGH);
  621.         delay(300);
  622.         digitalWrite(LED_BUILTIN, LOW);
  623.         //Serial.println("Initialize IIC");
  624. // sendDataWifi("No Error" ,random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000),random(1,1000));
  625. }
  626. //Loops forever. Checks for any incoming serial data and the time to stop sampling and send the data using other functions.
  627. int freeRam() {
  628.         extern int __heap_start, *__brkval;
  629.         int v;
  630.         return (int)&v - (__brkval == 0 ? (int)&__heap_start : (int)__brkval);
  631. }
  632. void loop()
  633. {
  634.         digitalWrite(LED_BUILTIN, HIGH);
  635.         if (millis() - lastMillis_data > 300000 && count != 0)
  636.         {
  637.                 sendSampledData();
  638.                 lastMillis_data = millis();
  639.         }
  640.         else if (millis() - lastMillis_sample > 500)
  641.         {
  642.                 sampleData();
  643.                 lastMillis_sample = millis();
  644.         }
  645.         if (Serial.available() > 1)
  646.         {
  647.                 SerialEvent();
  648.         }
  649.         if (Serial1.available() > 1)
  650.         {
  651.                 SerialEvent1();
  652.         }
  653.         //Serial.println("Finish Serial");
  654.         if (!Serial)
  655.         {
  656.                 USBData = false;
  657.         }
  658.         if (!Serial1)
  659.         {
  660.                 BTData = false;
  661.         }
  662.         if (millis() - lastMillis_send > 500 && mq2_min != 1024)
  663.         {
  664.                 sendDataUSB();
  665.                 sendDataBT();
  666.                 lastMillis_send = lastMillis_send;
  667.         }
  668.         digitalWrite(LED_BUILTIN, LOW);
  669.         //Serial.println("Exit loop");
  670. }
  671. //By default triggered when any data is received on Serial1(Bluetooth here) interface.
  672. void SerialEvent1()
  673. {
  674.         String serialString = Serial1.readStringUntil('\n');
  675.         StaticJsonBuffer<256> jsonBuffer;
  676.         JsonObject& serialInput = jsonBuffer.parseObject(serialString);
  677.         int cmd = serialInput["cmd"];
  678.         const char* sec = serialInput["sec"];
  679.         const char* ssid = serialInput["ssid"];
  680.         const char* password = serialInput["password"];
  681.         int _device_id = serialInput["device_id"];
  682.         int data = serialInput["data"];
  683.         if (cmd == 1)
  684.         {
  685.                 if (_device_id != 0)
  686.                 {
  687.                         device_id = _device_id;
  688.                 }
  689.                 if (ssid != NULL && sec != NULL && password != NULL)
  690.                 {
  691.                         digitalWrite(LED_BUILTIN, LOW);
  692.                         writeWifiEEPROM((char*)ssid, (char*)password, (char*)sec);
  693.                         connectWifi();
  694.                         digitalWrite(LED_BUILTIN, HIGH);
  695.                         delay(100);
  696.                         digitalWrite(LED_BUILTIN, LOW);
  697.                         delay(100);
  698.                         digitalWrite(LED_BUILTIN, HIGH);
  699.                         digitalWrite(LED_BUILTIN, LOW);
  700.                 }
  701.         }
  702.         else if (cmd == 0)
  703.         {
  704.                 if (data == 1)
  705.                 {
  706.                         BTData = true;
  707.                 }
  708.                 else if (data == 0)
  709.                 {
  710.                         BTData = false;
  711.                 }
  712.         }
  713. }\
  714. //By default triggered when any data is received on Serial(TTL-USB) interface/
  715. void SerialEvent()
  716. {
  717.         String serialString = Serial.readStringUntil('\n');
  718.         StaticJsonBuffer<256> jsonBuffer;
  719.         JsonObject& serialInput = jsonBuffer.parseObject(serialString);
  720.         int cmd = serialInput["cmd"];
  721.         const char* sec = serialInput["sec"];
  722.         const char* ssid = serialInput["ssid"];
  723.         const char* password = serialInput["password"];
  724.         int _device_id = serialInput["device_id"];
  725.         int data = serialInput["data"];
  726.         if (cmd == 1)
  727.         {
  728.                 if (_device_id != 0)
  729.                 {
  730.                         device_id = _device_id;
  731.                 }
  732.                 if (ssid != NULL && sec != NULL && password != NULL)
  733.                 {
  734.                         digitalWrite(LED_BUILTIN, LOW);
  735.                         writeWifiEEPROM((char*)ssid, (char*)password, (char*)sec);
  736.                         connectWifi();
  737.                         digitalWrite(LED_BUILTIN, HIGH);
  738.                         delay(100);
  739.                         digitalWrite(LED_BUILTIN, LOW);
  740.                         delay(100);
  741.                         digitalWrite(LED_BUILTIN, HIGH);
  742.                         digitalWrite(LED_BUILTIN, LOW);
  743.                 }
  744.         }
  745.         else if (cmd == 0)
  746.         {
  747.                 if (data == 1)
  748.                 {
  749.                         USBData = true;
  750.                 }
  751.                 else if (data == 0)
  752.                 {
  753.                         USBData = false;
  754.                 }
  755.         }
  756. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 20:50

【Arduino 动手做】Arduino环境监测温度、湿度和气压

【Arduino 动手做】Arduino环境监测温度、湿度和气压
项目链接:https://www.hackster.io/prajayba ... l-monitoring-7508d1
项目作者:普拉杰·巴苏

项目代码:https://github.com/prajaybasu/arduinoem/
https://hacksterio.s3.amazonaws. ... 33371/ArduinoEM.pdf
https://www.hackster.io/code_files/56115/download

【Arduino 动手做】Arduino环境监测温度、湿度和气压图1

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail