ESP8266连接OneNET平台控制舵机和获取光线数据
ESP8266连接OneNET平台控制舵机和获取光线数据
所需硬件:
- ESP8266开发板
- DHT11温湿度传感器
- 舵机
- 面包板
- 连接线
所需软件:
- Arduino IDE
- ESP8266库
- DHT11库
- OneNET平台账号
步骤:
-
连接硬件:
- 将ESP8266开发板连接到电脑。
- 将DHT11温湿度传感器连接到ESP8266开发板的D4引脚。
- 将舵机连接到ESP8266开发板的D7引脚。
-
安装库:
- 在Arduino IDE中安装ESP8266库和DHT11库。
-
注册OneNET平台账号:
- 在OneNET平台上注册一个账号,并创建一个设备。
- 获取设备ID和APIKey。
-
修改代码:
- 将代码中的以下内容修改为自己的信息:
SSID:WIFI名称PASSWORD:WIFI密码DEVICE_ID:OneNET设备IDAPIKey:OneNET APIKey
- 将代码中的以下内容修改为自己的信息:
-
上传代码:
- 将修改后的代码上传到ESP8266开发板。
代码:
//引入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);
if (len > 0) {
Serial.print(F('['));
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; }//清空数组,等待下次传输数据
else {
Serial.print('create tcp err\r\n');
}
Serial.println('');
net_time1 = millis();
}
}
为什么不能从onenet读取light值内容:可能是因为请求的命令字符串有误导致无法正确获取数据流的值。可以检查请求命令字符串是否正确,并确认设备ID和数据流ID是否正确。另外,还需要确认APIKey是否正确,并确保设备已经成功连接到OneNet平台。如果问题仍然存在,可以查看OneNet平台的日志或者联系OneNet平台的技术支持进行排查。
注意事项:
- 代码中的WIFI名称和密码需要修改为自己的信息。
- OneNET设备ID和APIKey需要修改为自己的信息。
- DHT11温湿度传感器需要连接到正确的引脚。
- 舵机需要连接到正确的引脚。
- 在上传代码之前,需要确保ESP8266开发板已经成功连接到WIFI。
总结:
本教程介绍了如何使用ESP8266连接OneNET平台,获取温度和湿度数据,并根据光线数据流的值控制舵机的位置。可以通过修改代码实现更多功能,例如控制灯光、电机等。
原文地址: https://www.cveoy.top/t/topic/oMuI 著作权归作者所有。请勿转载和采集!