//引入ESP8266.h头文件,建议使用教程中修改后的文件 #include 'ESP8266.h' #include 'dht11.h' #include 'SoftwareSerial.h' #include <WiFi.h> #include <Servo.h>

//配置ESP8266WIFI设置 #define SSID 'HONOR Play4T' //填写2.4GHz的WIFI名称,不要使用校园网 #define PASSWORD '12345678' //填写自己的WIFI密码 #define HOST_NAME 'api.heclouds.com' //API主机名称,连接到OneNET平台,无需修改 #define DEVICE_ID '1099655073' //填写自己的OneNet设备ID #define HOST_PORT (80) //API端口,连接到OneNET平台,无需修改 String APIKey = 'IiJSs17atNND2C77wumz03w63hw='; //与设备绑定的APIKey String cmdUrl = 'http://api.heclouds.com/cmds?device_id=1099655073'; #define INTERVAL_SENSOR 5000 //定义传感器采样及发送时间间隔

//创建dht11示例 dht11 DHT11; //创建舵机 Servo myservo; int servoPin = 7; int light = 0; int servoPos = 0; //定义DHT11接入Arduino的管脚 #define DHT11PIN 4

//定义ESP8266所连接的软串口 /*********************

  • 该实验需要使用软串口
  • Arduino上的软串口RX定义为D3,
  • 接ESP8266上的TX口,
  • Arduino上的软串口TX定义为D2,
  • 接ESP8266上的RX口.
  • D3和D2可以自定义,
  • 但接ESP8266时必须恰好相反 *********************/ SoftwareSerial mySerial(3, 2); ESP8266 wifi(mySerial);

void handleCommand(String command) { Serial.print('Command received: '); Serial.println(command);

if (command == '0') { //控制舵机转到0度位置 myservo.write(0); servoPos = 0; light = 0; Serial.println('Servo position: 0'); myservo.write(servoPos); } else if (command == '1') { //控制舵机转到180度位置 myservo.write(180); servoPos = 180; light = 1; Serial.println('Servo position: 180'); myservo.write(servoPos); } else { Serial.println('Invalid command'); } }

void setup() { mySerial.begin(115200); //初始化软串口 Serial.begin(9600); //初始化串口 Serial.print('setup begin ');

myservo.attach(servoPin); myservo.write(0);

//以下为ESP8266初始化的代码 Serial.print('FW Version: '); Serial.println(wifi.getVersion().c_str());

if (wifi.setOprToStation()) { Serial.print('to station ok '); } else { Serial.print('to station err '); }

//ESP8266接入WIFI if (wifi.joinAP(SSID, PASSWORD)) { Serial.print('Join AP success '); Serial.print('IP: '); Serial.println(wifi.getLocalIP().c_str()); } else { Serial.print('Join AP failure '); } Serial.println(''); Serial.print('DHT11 LIBRARY VERSION: '); Serial.println(DHT11LIB_VERSION);

mySerial.println('AT+UART_CUR=9600,8,1,0,0'); mySerial.begin(9600); Serial.println('setup end '); }

unsigned long net_time1 = millis(); //数据上传服务器时间 unsigned long net_time2 = millis(); //获取命令时间 void loop() {

if (net_time1 > millis()) net_time1 = millis();

if (millis() - net_time1 > INTERVAL_SENSOR) //发送数据时间间隔 {

int chk = DHT11.read(DHT11PIN);

Serial.print('Read sensor: ');
switch (chk) {
  case DHTLIB_OK:
    Serial.println('OK');
    break;
  case DHTLIB_ERROR_CHECKSUM:
    Serial.println('Checksum error');
    break;
  case DHTLIB_ERROR_TIMEOUT:
    Serial.println('Time out error');
    break;
  default:
    Serial.println('Unknown error');
    break;
}

float sensor_hum = (float)DHT11.humidity;
float sensor_tem = (float)DHT11.temperature;
Serial.print('Humidity (%): ');
Serial.println(sensor_hum, 2);

Serial.print('Temperature (oC): ');
Serial.println(sensor_tem, 2);
Serial.println('');

if (wifi.createTCP(HOST_NAME, HOST_PORT)) { //建立TCP连接,如果失败,不能发送该数据
  Serial.print('create tcp ok

'); char buf[10];

  //拼接发送data字段字符串
  String jsonToSend = '{"Temperature":';
  dtostrf(sensor_tem, 1, 2, buf);
  jsonToSend += ''' + String(buf) + ''';
  jsonToSend += ',"Humidity":';
  dtostrf(sensor_hum, 1, 2, buf);
  jsonToSend += ''' + String(buf) + ''';
  jsonToSend += ',"light":';
  jsonToSend += ''' + String(light) + ''';
  jsonToSend += '}';

  //拼接POST请求字符串
  String postString = 'POST /devices/';
  postString += DEVICE_ID;
  postString += '/datapoints?type=3 HTTP/1.1';
  postString += '

'; postString += 'api-key:'; postString += APIKey; postString += ' '; postString += 'Host:api.heclouds.com '; postString += 'Connection:close '; postString += 'Content-Length:'; postString += jsonToSend.length(); postString += ' '; postString += ' '; postString += jsonToSend; postString += ' '; postString += ' '; postString += ' ';

  const char *postArray = postString.c_str(); //将str转化为char数组

  Serial.println(postArray);
  wifi.send((const uint8_t *)postArray, strlen(postArray)); //send发送命令,参数必须是这两种格式,尤其是(const uint8_t*)
  Serial.println('send success');

  if (wifi.releaseTCP()) { //释放TCP连接
    Serial.print('release tcp ok

'); } else { Serial.print('release tcp err '); } postArray = NULL; } else { Serial.print('create tcp err '); }

Serial.println('');
net_time1 = millis();

}

//从OneNET服务器获取命令 if (millis() - net_time2 > 10000) { //获取命令时间间隔 if (wifi.createTCP(HOST_NAME, HOST_PORT)) { //建立TCP连接,如果失败,不能获取命令 Serial.print('create tcp ok ');

  //拼接GET请求字符串
  String cmdString = 'GET ';      
  cmdString += cmdUrl;
  cmdString += ' HTTP/1.1';
  cmdString += '

'; cmdString += 'api-key:'; cmdString += APIKey; cmdString += ' '; cmdString += 'Host:api.heclouds.com '; cmdString += 'Connection:close '; cmdString += ' '; cmdString += ' '; cmdString += ' ';

  const char *cmdArray = cmdString.c_str(); //将str转化为char数组

  Serial.println(cmdArray);
  wifi.send((const uint8_t *)cmdArray, strlen(cmdArray)); //send发送命令,参数必须是这两种格式,尤其是(const uint8_t*)

  //等待服务器回复
  String recvBuf = '';
  while (true) {
    int len = wifi.recv((uint8_t *)mySerial_buf, sizeof(mySerial_buf), 1000); //接收数据
    if (len <= 0) {
      Serial.println('recv timeout');
      break;
    } else {
      mySerial_buf[len] = '\0';
      Serial.print(mySerial_buf);
      recvBuf += String(mySerial_buf);
    }
  }

  cmdArray = NULL;

  //解析命令
  int pos = recvBuf.indexOf('"cmd":"');
  if (pos >= 0) {
    int endPos = recvBuf.indexOf('"', pos + 8);
    if (endPos >= 0) {
      String command = recvBuf.substring(pos + 7, endPos);
      handleCommand(command);
    }
  }

  if (wifi.releaseTCP()) { //释放TCP连接
    Serial.print('release tcp ok

'); } else { Serial.print('release tcp err '); } } else { Serial.print('create tcp err '); }

Serial.println('');
net_time2 = millis();

}

Arduino 连接 ESP8266 上传温湿度数据到 OneNET 并接收命令控制舵机

原文地址: https://www.cveoy.top/t/topic/oK9X 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录