BPI-M2+ 气象站_12_气象数据的上传 (arduino)

这里用到的硬件较多,也可以只上传部分传感器的数据
1.arduino nano (mega2560, uno 都可以);
2.ds18b20;
3.dht11;
4.bmp180;
5.bh1750;
6.esp8266 (esp8266对供电要求较高,需要注意);
(3~5为可选模块)

arduino 通过 ESP8266 上传传感器数据到 BPI,ESP8266需要提前设置好wifi用户名和密码,使其开机可以自动登录
pm2.5 和 co2 的上传功能可以参考前面的代码自行添加

// ESP8266
#include <ESP8266.h>
#ifdef ESP8266_USE_SOFTWARE_SERIAL
SoftwareSerial mySerial_8266(2, 3); // MEAG TX:10, RX:11
ESP8266 wifi(mySerial_8266, 9600);
#else
ESP8266 wifi(Serial1, 9600);
#endif
#define HOST_NAME   "192.168.1.2"   //bpi ip
#define HOST_PORT   (80)
String MAC = "";
String IP = "";

#include "bmp180.h"
#include "dht11.h"
#include "bh1750.h"
#include <OneWire.h>

OneWire  ds(5);     // ds18b20 pin D5
bh1750 BH1750;
bmp180 BMP180;
dht11 dht11_0;

unsigned long t_loop;
boolean b_con = false;

#define DHT11PIN_0 4

int e_18b20 = 0;
float getTemp_ds18b20() {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;

  if ( !ds.search(addr)) {
   ds.reset_search();
   delay(250);
   if (e_18b20 < 10) {
   e_18b20++;
   return getTemp_ds18b20();
   }
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
   if (e_18b20 < 10) {
   e_18b20++;
   return getTemp_ds18b20();
   }
  }

  // the first ROM byte indicates which chip
  switch (addr[0]) {
   case 0x10:
   type_s = 1;
   break;
   case 0x28:
   type_s = 0;
   break;
   case 0x22:
   type_s = 0;
   break;
   default:
   if (e_18b20 < 10) {
   e_18b20++;
   return getTemp_ds18b20();
   }
  }

  e_18b20 = 0;

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);      

  delay(100);     

  present = ds.reset();
  ds.select(addr);
  ds.write(0xBE);         

  for ( i = 0; i < 9; i++) {          
   data* = ds.read();

  }
  OneWire::crc8(data, 8);

  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
   raw = raw << 3; 
   if (data[7] == 0x10) {
   raw = (raw & 0xFFF0) + 12 - data[6];
   }
  } else {
   byte cfg = (data[4] & 0x60);

   if (cfg == 0x00) raw = raw & ~7;  
   else if (cfg == 0x20) raw = raw & ~3; 
   else if (cfg == 0x40) raw = raw & ~1; 
  }
  celsius = (float)raw / 16.0;
  return celsius;
}

void setup() {
  Serial.begin(9600);
  BMP180.Calibration();
  
  t_loop = millis();
}

void loop() {

  float temperature = BMP180.GetTemperature();
  float pressure = BMP180.GetPressure();

  dht11_0.read(DHT11PIN_0);
  float dht_h0 = (float)dht11_0.humidity;
  float dht_t0 = (float)dht11_0.temperature;

  float lx = BH1750.lx();
  lx = abs(lx);

  float t_ds18b20 = getTemp_ds18b20();
  t_ds18b20 = long(t_ds18b20 * 10) / 10.0;
  float t_s = ( millis() - t_loop) / 1000;

  Serial.print("t0:");
  Serial.print(t_ds18b20, 1);
  Serial.print("; ");

  Serial.print("h1:");
  Serial.print(dht_h0, 0);
  Serial.print("; ");

  Serial.print("t1:");
  Serial.print(dht_t0, 0);
  Serial.print("; ");

  Serial.print("t3:");
  Serial.print(temperature, 1);
  Serial.print("; ");

  Serial.print("p:");
  Serial.print(pressure, 0);
  Serial.print("; ");

  Serial.print("l:");
  Serial.print( lx );
  Serial.print("; ");

  Serial.print("delay:");
  Serial.print( t_s );
  Serial.println();
  
  if ( t_s > 120) {
#ifdef ESP8266_USE_SOFTWARE_SERIAL
   mySerial_8266.listen();
#endif
   b_con = wifi.createTCP(HOST_NAME, HOST_PORT);
   Serial.print("con:");
   Serial.print(B(b_con));
   if (!b_con) {
   wifi.restart();
   Serial.println();
   t_loop = millis();
   return;
   }

   postData("ds18b20",         t_ds18b20     );
   postData("dht11_temp",      dht_t0        );
   postData("dht11_humidity",  dht_h0        );
   postData("bmp180_p",        pressure      );
   postData("bmp180_temp",     temperature   );
   postData("bh1750",          lx            );
   postData("dht11_temp2",     dht_t0        );
   postData("dht11_humidity2", dht_h0        );
   
   b_con = ! wifi.releaseTCP();
   Serial.print("; close:");
   Serial.println(B(!b_con));
   t_loop = millis();
  }

  delay(5000);
}

String B(boolean b) {
  if (b) return "true";
  else return "false";
}


void postData(String key, float val) {
  if (b_con) {

   String s = "POST /weather/main.php?cmd=setdata&key="
   + key + "&val=" + String(val) + " HTTP/1.1\r\n"
   + "Host: " + String(HOST_NAME) + "\r\n"
   + "Content-Length: 0\r\n"
   + "\r\n"
   + "\r\n";

   char c[s.length()];
   s.toCharArray(c, s.length());

   char *_p = c;

   wifi.send((const uint8_t*)_p, strlen(_p));

   delay(1000);

  } else {
   Serial.print("create tcp err\r\n");
  }

}


weather_Water.ino weather_Water.rar (1.66 KB)
ESP8266库 ITEADLIB_Arduino_WeeESP8266-master.zip (419 KB)

上一篇: 气象站_11_部署自己的网站 (nginx+php)*