// 引入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 lightDatastreamId = 'light'; // 光线数据流ID #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\r\n');

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\r\n'); } else { Serial.print('to station err\r\n'); }

// ESP8266接入WIFI if (wifi.joinAP(SSID, PASSWORD)) { Serial.print('Join AP success\r\n'); Serial.print('IP: '); Serial.println(wifi.getLocalIP().c_str()); } else { Serial.print('Join AP failure\r\n'); } 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\r\n');

}

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\r\n');
  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 += '}';

  // 拼接POST请求字符串
  String postString = 'POST /devices/';
  postString += DEVICE_ID;
  postString += '/datapoints?type=3 HTTP/1.1';
  postString += '\r\n';
  postString += 'api-key:';
  postString += APIKey;
  postString += '\r\n';
  postString += 'Host:api.heclouds.com\r\n';
  postString += 'Connection:close\r\n';
  postString += 'Content-Length:';
  postString += jsonToSend.length();
  postString += '\r\n';
  postString += '\r\n';
  postString += jsonToSend;
  postString += '\r\n';
  postString += '\r\n';
  postString += '\r\n';

  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');*/

// 请求获取光线数据流的值 String getCmd = 'GET /devices/1099655073/datastreams?datastreams_id=light HTTP/1.1\r\napi-key:IiJSs17atNND2C77wumz03w63hw=\r\nHost: api.heclouds.com\r\nConnection: close\r\n\r\n';

  wifi.send((const uint8_t *)getCmd.c_str(), getCmd.length());
  Serial.println('get light datastream value');

  uint8_t buffer[512] = {0};
  uint32_t len = wifi.recv(buffer, sizeof(buffer), 20000);
  
    Serial.print(F('Received:['));
    for (uint32_t i = 0; i < len; i++) {
      Serial.print((char)buffer[i]);
    }
    Serial.println(F(']'));

    String datastreamValue = '';
    for (uint32_t i = 0; i < len; i++) {
      if (buffer[i] == ':') { // 找到冒号,说明值在冒号后面
        i += 2; // 跳过冒号和引号
        while (buffer[i] != ''') { // 找到下一个引号,说明值的结束
          datastreamValue += (char)buffer[i];
          i++;
        }
        break; // 找到值后退出循环
      }
    }

    Serial.print('Light value: ');
    Serial.println(datastreamValue);

    if (datastreamValue == '1') { // 根据光线值控制舵机位置
      handleCommand('1');
    } else {
      handleCommand('0');
    }
  
 
  if (wifi.releaseTCP()) { // 释放TCP连接
    Serial.print('release tcp ok\r\n');
  } else {
    Serial.print('release tcp err\r\n');
  }

//postArray = NULL; }//清空数组,等待下次传输数据

Serial.println('');

net_time1 = millis(); } wifi.recv为什么不能给buffer输入数据,修改代码

      内容:uint8_t buffer[512] = {0};
  uint32_t len = wifi.recv(buffer, sizeof(buffer), 20000);
  
  if (len > 0) { // 判断是否接收到数据
    Serial.print(F('Received:['));
    for (uint32_t i = 0; i < len; i++) {
      Serial.print((char)buffer[i]);
    }
    Serial.println(F(']'));

    String datastreamValue = '';
    for (uint32_t i = 0; i < len; i++) {
      if (buffer[i] == ':') { // 找到冒号,说明值在冒号后面
        i += 2; // 跳过冒号和引号
        while (buffer[i] != ''') { // 找到下一个引号,说明值的结束
          datastreamValue += (char)buffer[i];
          i++;
        }
        break; // 找到值后退出循环
      }
    }

    Serial.print('Light value: ');
    Serial.println(datastreamValue);

    if (datastreamValue == '1') { // 根据光线值控制舵机位置
      handleCommand('1');
    } else {
      handleCommand('0');
    }
  } else {
    Serial.println('No data received');
  }
 
  if (wifi.releaseTCP()) { // 释放TCP连接
    Serial.print('release tcp ok\r\n');
  } else {
    Serial.print('release tcp err\r\n');
  }
  memset(buffer, 0, sizeof(buffer)); // 清空缓存数组,等待下次接收数据
}

net_time1 = millis(); // 更新上传数据时间

}

if (net_time2 > millis()) net_time2 = millis();

if (millis() - net_time2 > 5000) { // 获取命令时间间隔 String getCmd = 'GET /cmds?device_id=1099655073 HTTP/1.1\r\napi-key:IiJSs17atNND2C77wumz03w63hw=\r\nHost: api.heclouds.com\r\nConnection: close\r\n\r\n'; wifi.send((const uint8_t *)getCmd.c_str(), getCmd.length()); Serial.println('get command');

uint8_t buffer[512] = {0};
uint32_t len = wifi.recv(buffer, sizeof(buffer), 20000);

if (len > 0) { // 判断是否接收到数据
  Serial.print(F('Received:['));
  for (uint32_t i = 0; i < len; i++) {
    Serial.print((char)buffer[i]);
  }
  Serial.println(F(']'));

  String command = '';
  for (uint32_t i = 0; i < len; i++) {
    if (buffer[i] == ':') { // 找到冒号,说明命令在冒号后面
      i += 2; // 跳过冒号和引号
      while (buffer[i] != ''') { // 找到下一个引号,说明命令的结束
        command += (char)buffer[i];
        i++;
      }
      break; // 找到命令后退出循环
    }
  }

  if (command != '') { // 判断是否接收到命令
    handleCommand(command);
  } else {
    Serial.println('No command received');
  }
} else {
  Serial.println('No data received');
}

if (wifi.releaseTCP()) { // 释放TCP连接
  Serial.print('release tcp ok\r\n');
} else {
  Serial.print('release tcp err\r\n');
}

memset(buffer, 0, sizeof(buffer)); // 清空缓存数组,等待下次接收数据
net_time2 = millis(); // 更新获取命令时间

} }


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

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