科技小制作 - 使用Node-RED + DHT11 + ESP8266实现温湿度气象站

Raspberry Pi, Arduino, 不管项目简单还是复杂,动手实现它就是成功!
头像
lgn
Site Admin
帖子: 15
注册: 周二 3月 10, 2015 12:41 am
地址: Shenzhen

科技小制作 - 使用Node-RED + DHT11 + ESP8266实现温湿度气象站

帖子lgn » 周四 5月 17, 2018 10:40 am

B站视频:
https://www.bilibili.com/video/av23531283/

继续IoT系列的步伐,本期还是基础知识的预备,通过一个小项目实例了解Node-RED的基本使用,对物联网感兴趣的不容错过哦!

直接使用本方案,请下载附件中的代码。

代码由两部分组成:
    .ino是Arduino IDE代码,直接使用Arduino IDE打开,编辑,烧写,配置内容请参考视频中说明;(需要esp8266库、pubsubclient库、DHT库支持,详见视频)
    .json是Node-RED流程导出代码,使用文本编辑器打开后全选、拷贝,然后通过Node-RED界面右上菜单选择导入、剪贴板,在弹出窗口粘贴,点击红色import,完成后部署/deploy使流程生效;
Screen Shot 2018-05-17 at 10.16.51 AM.png


Node-RED用户界面访问参考视频中的说明。



代码下载:
esp8266_dht11_nodered.zip

esp-01配置:30秒刷新,WI-FI信息空
node-RED配置:MQTT服务器-aibs.mobi
您没有权限查看这个主题的附件。
世界上只有10种人,一种懂二进制的,另外是不懂的 :geek:
shi370540
帖子: 9
注册: 周一 6月 18, 2018 5:04 pm

Re: 科技小制作 - 使用Node-RED + DHT11 + ESP8266实现温湿度气象站 by 科技小制作

帖子shi370540 » 周六 6月 23, 2018 10:06 pm

大佬,你的esp源代码 mqtt_server域名改成树莓派IP,树莓上mqtt订阅的“weather/temp”,“weather/humidity” 一直显示
init...
nan
nan
nan
nan
nan
nan
nan
init...
nan
init...
nan
nan
nan
不显示温度,湿度? 求解(泣)(泣)
头像
lgn
Site Admin
帖子: 15
注册: 周二 3月 10, 2015 12:41 am
地址: Shenzhen

Re: 科技小制作 - 使用Node-RED + DHT11 + ESP8266实现温湿度气象站 by 科技小制作

帖子lgn » 周日 6月 24, 2018 10:21 am

shi370540 写了:大佬,你的esp源代码 mqtt_server域名改成树莓派IP,树莓上mqtt订阅的“weather/temp”,“weather/humidity” 一直显示
init...
nan
nan
nan
nan
nan
nan
nan
init...
nan
init...
nan
nan
nan
不显示温度,湿度? 求解(泣)(泣)


能把你修改后的代码贴上来看看吗,初步看输出显示是没有数据,可能是传感器也可能是mqtt服务消息问题。。。
世界上只有10种人,一种懂二进制的,另外是不懂的 :geek:
shi370540
帖子: 9
注册: 周一 6月 18, 2018 5:04 pm

Re: 修改后的代码

帖子shi370540 » 周日 6月 24, 2018 10:36 am

/*
* ESP-01/8266 + DHT11 IoT温度传感节点
* by Kjxzz
*
* https://www.bilibili.com/video/av23531283/
*/
#include <Adafruit_Sensor.h>
#include <DHT_U.h>
#include <ESP8266WiFi.h>
#include "DHT.h"
#include <PubSubClient.h>

#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

const char* ssid = "W。。。6";
const char* password = "s。。。";
const char* mqtt_server = "192.168.10.169";

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];

float h; // humidity
float t; // temperature

void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();

// Switch on the LED if an 1 was received as first character
if ((char)payload[0] == '1') {
digitalWrite(BUILTIN_LED, LOW); // Turn the LED on (Note that LOW is the voltage level
// but actually the LED is on; this is because
// it is acive low on the ESP-01)
} else {
digitalWrite(BUILTIN_LED, HIGH); // Turn the LED off by making the voltage HIGH
}

}

void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect("ESP8266Client")) {
Serial.println("connected");
// Once connected, publish an announcement...
client.publish("weather/temp", "init...");
client.publish("weather/humidity", "init...");
// ... and resubscribe
client.subscribe("weather/control");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}

void setup(void){
pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
delay(2000); // delay for DHT11 init.
}

void loop(void){
if (!client.connected()) {
reconnect();
}
client.loop();

long now = millis();
if (now - lastMsg > 30000) {
lastMsg = now;
gettemp();
Serial.print("Publish message: ");
Serial.println(t);
char tmp[7];
dtostrf(t,4,3,tmp);
client.publish("weather/temp", tmp);
Serial.print("Publish message: "); Serial.println(h);
dtostrf(h,4,3,tmp);
client.publish("weather/humidity", tmp);
}
}

void gettemp() {mosquitto_sub -h aibs.mobi -u aibs_pub -P SB4NJw4Aq0j。。。uwFw== -t "weather/humidity"
h = dht.readHumidity();
t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
}
shi370540
帖子: 9
注册: 周一 6月 18, 2018 5:04 pm

ardunio 的库

帖子shi370540 » 周日 6月 24, 2018 10:56 am

ardunio 的库
您没有权限查看这个主题的附件。
头像
lgn
Site Admin
帖子: 15
注册: 周二 3月 10, 2015 12:41 am
地址: Shenzhen

Re: 科技小制作 - 使用Node-RED + DHT11 + ESP8266实现温湿度气象站 by 科技小制作

帖子lgn » 周日 6月 24, 2018 3:50 pm

从代码看好像没有什么问题,除了gettemp()函数后面多出来的mosquitto_sub部分内容,我相信你是粘贴错误。。。

在arduino串口有没有什么打印信息呢?
nan这个部分可以对照arduino串口的打印内容来分析,有可能是传感器输出数据不正常或者传感器输出数据导致后续的转换不正常

你使用的是不是DHT11?可以在gettemp()函数中

代码: 全选

if (isnan(h) || isnan(t)) {

之前加上两个打印语句,看看传感器输出的实际内容是什么,代码如下:

代码: 全选

Serial.println("======");
Serial.println(h);
Serial.println(t);
Serial.println("======");

nan的输出一般来说可能是有数据被Arduino认为是无效的数字(有一些浮点数会被认为是无效的数字),从而导致产生nan这个字符串,但一般应该是NaN,而且在Arduino代码的最后部分有判断,如果温度或者湿度数据获取不正常,会在Arduino串口里打印对应文字信息。

你用这个方法试试看能不能发现新的原因~
(另外,我把你原帖中的wifi信息做了修改)
世界上只有10种人,一种懂二进制的,另外是不懂的 :geek:
shi370540
帖子: 9
注册: 周一 6月 18, 2018 5:04 pm

Re: 大佬真牛

帖子shi370540 » 周日 6月 24, 2018 11:44 pm

确实是获取温湿度不正常,但是树莓派用python能获取传感器数据,传感器看着不像坏了啊
您没有权限查看这个主题的附件。
头像
lgn
Site Admin
帖子: 15
注册: 周二 3月 10, 2015 12:41 am
地址: Shenzhen

Re: 大佬真牛

帖子lgn » 周一 6月 25, 2018 8:53 am

shi370540 写了:确实是获取温湿度不正常,但是树莓派用python能获取传感器数据,传感器看着不像坏了啊

这种情况可以再次确认Arduino支持库的安装是否正确(视频中07:56开始),确认完全正确后把代码顶部的

代码: 全选

#include <Adafruit_Sensor.h>
#include <DHT_U.h>

删除,然后再试试看
世界上只有10种人,一种懂二进制的,另外是不懂的 :geek:
shi370540
帖子: 9
注册: 周一 6月 18, 2018 5:04 pm

Re: 科技小制作 - 使用Node-RED + DHT11 + ESP8266实现温湿度气象站 by 科技小制作

帖子shi370540 » 周一 6月 25, 2018 9:25 pm

正常收到数据了 :lol: :lol: :lol: :lol:
头像
lgn
Site Admin
帖子: 15
注册: 周二 3月 10, 2015 12:41 am
地址: Shenzhen

Re: 科技小制作 - 使用Node-RED + DHT11 + ESP8266实现温湿度气象站 by 科技小制作

帖子lgn » 周一 6月 25, 2018 10:29 pm

shi370540 写了:正常收到数据了 :lol: :lol: :lol: :lol:

怎么解决的?
世界上只有10种人,一种懂二进制的,另外是不懂的 :geek:

回到 “天工开物”

在线用户

用户浏览此论坛: 没有注册用户 和 1 访客