【FireBeetle Board-ESP32评测报告之二】温度上送物联网及OLED本地显示
【上期回顾】
我们已经建立了FireBeetle Board-ESP32专属的IDE,并且已经玩了一个blink(硬件界的helloworld),并且驱动了一片iic接口的OLED。 本期我们做一个小小的温度物联网应用。将本地采集的数据上送至物联网,同时也在本地做一个显示系统。 技术都很简单,代码和接线全部得到沧海的验证。大约一小时就可以搭建这样一个物联网应用。我们一起来做吧。
【本期用到的硬件】 2、LM35 温度传感器 1只(淹没在杜邦线里面了) 3、OLED 液晶显示器 1只(ssd1306驱动 ,IIC接口) 4、LED(全彩) 1只 5、杜邦线若干 6、小面包板 2块 【本期用到的软件】 1、Arduino ide foresp3266(dfrobot 官方,萤火虫专用,v0.04) 2、mqtt库PubSubClient.h 3、oled库ACROBOTIC_SSD1306.h 4、tlink.io的设备以及ID申请。这个在我以前的帖子里搜吧。或者直接去tlink.io官网。你也许有自己熟悉的物联网应用,那么稍加替换即可。切记,咱们用的是MQTT协议。
【接线及代码】
FireBeetle Board-ESP32 | | | | | DATA OUTPUT(面对丝印,中间的pin ) |
|
| | |
|
| | | | | |
| |
| |
| |
| |
| |
| |
|
| |
代码借鉴了Basic ESP8266 MQTT example
- <div align="left">/*
- * 2017-05-29
- * 采用FireBeetle Board-ESP32板,lm35接入,mqtt协议测试
- * 序列号:请用您申请到的设备序列号,个人用户是免费的
- * json格式:{"sensorDatas":[{"value":23.04}]}
- * 上送间隔:20S
- * LED D3显示上送过程,闪动一次上送一次
- * oled显示连接过程以及温度的本地显示
- * 测试FireBeetle Board-ESP32,it works
- */
-
-
- #include <WiFi.h>
- #include <PubSubClient.h>
-
-
- // configure the following values as neccesary
- const char* ssid = "your ssid";
- const char* password = "your psw";
- const char* mqtt_server = "mqtt.tlink.io";
- //const char* mqtt_username = "";
- //const char* mqtt_password = "";
- const char* mqtt_topic = "your tlink id";
-
-
- //关于LM35变量*************温度传感器部分设置
- int potPin = A0; //设置模拟口A0为LM35的信号输入端口
- float temperature = 0; //设置temperature为浮点变量
- long val=0; //设置val为长整数变量
-
- //*********关于连接的管理
- unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds
- const unsigned long postingInterval = 10*2000; // delay between 2 datapoints, 20s
-
- //关于oled的设置
- #include <Wire.h>
- #include <ACROBOTIC_SSD1306.h>
- unsigned char brightness = 255;
-
- //配置wifi客户端以及mqtt客户端
- WiFiClient espClient;
- PubSubClient client(espClient);
-
-
- void callback(char* topic, byte* payload, unsigned int length) {
- // handle message arrived
- char mypl[48];
- Serial.println(length);
- memcpy(mypl,payload,length);
- mypl[length]=char(0);
- Serial.print("receive: ");
- Serial.print(topic);
- Serial.print("->");
- Serial.println(mypl);
- }
-
-
- void setup()
- {
- Serial.begin(115200);
- delay(500);
- pinMode(D3, OUTPUT); //用于显示数据上送
- Wire.begin();
- oled.init();
- oled.clearDisplay();
- oled.setBrightness((unsigned char)brightness);
- // We start by connecting to a WiFi network
-
- Serial.println(); </div><div align="left"> Serial.println();
- Serial.print("Connecting to ");
- Serial.println(ssid);
- WiFi.begin(ssid, password);
- while (WiFi.status() != WL_CONNECTED) {
- delay(1000);
- Serial.print(".");
- }
-
- Serial.println("");
- oled.setTextXY(3,4);
- oled.putString("WiFi OK");
- Serial.println("WiFi connected");
- Serial.println("IP address: ");
- Serial.println(WiFi.localIP());
-
- client.setServer(mqtt_server, 1883);//连接MQTT服务器
-
- }
-
-
- void loop()
- {
- val=analogRead(potPin);//温度传感器LM35接到模拟PIN0上;val变量为从LM35信号口读取到的数值
- if((millis() - lastConnectionTime > postingInterval)) {
- temperature = val*0.001409587904157*100;
- //把读取到的val转换为温度数值,系数一:0.001220703125=5/4096,0~5V对应模拟口读数
- //但是实测了vcc的电压为4.33V,因此对照UNO做了一个校正,选择系数一:0.001220703125*5/4.33=0.001409587904157
- //1~4096,系数二:100=1000/10,1000是毫伏与伏的转换;10是每10毫伏对应一度温升。
- sendData(temperature);
-
- }
-
- delay(500);
- reconnect();
-
- client.loop();
- }
-
- void sendData(float thisData) {
- String msg = "{"sensorDatas":[{"value":"; //mqtt head
- char s_temp[5];
- dtostrf(thisData,2,2,s_temp);//把温度值转换为两位整数,两位小数的字符串
- msg+= s_temp;
- msg+=" }] }";//结束符,具体在tlink中API定义
- char mqttmsg[40];
- msg.toCharArray(mqttmsg,40); //Copies the string's characters to the supplied buffer.
- delay(1000);
- //发布一组数据,标题是设备序列号,内容是json格式的传感器数据
- client.publish(mqtt_topic,mqttmsg);
- lastConnectionTime = millis();
- Serial.println(mqttmsg);
- oled.setTextXY(6,4);
- oled.putString(s_temp); //oled本地显示温度数据
-
- digitalWrite(D3, HIGH); // LED D3闪动,显示数据上送
- delay(1000);
- digitalWrite(D3, LOW);
-
- }
-
-
- void reconnect() {
- // Loop until we're reconnected
- while (!client.connected()) {
- Serial.print("Attempting MQTT connection...");
- if (client.connect("ESP32Client")) {
- Serial.println("connected");
- oled.setTextXY(5,4);
- oled.putString("MQTT OK");
- } else {
- Serial.print("failed, rc=");
- Serial.print(client.state());
- Serial.println(" try again in 500 ms");
- // Wait 5 seconds before retrying
- delay(500);
- }
- }
- }</div>
复制代码
(图中数据突变部分,是我认为用手指触碰LM35后的变化) 【小结】 1、本次测试采用的是FireBeetleBoard-ESP32板V0.3,非最新版本,在连接wifi时,成功率非100%,我想可能性较大的是硬件版本问题。随着V1.0版推出,将做进一步测试。并且及时报告连接情况。
2、连接后,运行很稳定,FireBeetleBoard-ESP32板----tlink.io物联网站,跑了15个小时,没有发生中断,连接稳定。散热罩发热情况尚可。已经建议ANDY师兄考虑对ESP32散热的进一步改进。
本期我们探索了esp32的蓝牙应用,下期咱们一起看看BLE的情况吧。 库来自github.com,您在使用和传播时注意版权,尊重其原作者权益。
|