上次到查看物联网搭建的结果了
结果呈现这样就成功了。我们使用esp8266连接我们搭建好的服务器实验一下。下面是一个简单的控制led灯的代码
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// WiFi参数
const char* ssid = "loushi";//你的wifiming
const char* password = "88888888";//你的wifi密码
// MQTT服务器参数
const char* mqtt_server = "192.168.31.76";//你服务器电脑的ip
const char* mqtt_username = "admin";//mqtt当时设置的账号
const char* mqtt_password = "11111111";//mqtt当时设置的密码
// MQTT客户端
const char* clientName = "ip_3";// 标识当前设备的客户端编号 不要和电脑设置的id重复
const char* topic = "ad";// 订阅信息主题
// LED控制引脚
const int ledPin = LED_BUILTIN; // 假设使用贴片led引脚
// WiFi客户端
WiFiClient espClient;
PubSubClient client(espClient);
// 回调函数,当接收到消息时调用
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("收到消息: [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
// 将payload转换为整数
int value = atoi((char*)payload);
// 控制LED
if (value == 1) {
digitalWrite(ledPin, LOW); // 点亮LED
} else {
digitalWrite(ledPin, HIGH); // 熄灭LED
}
}
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(115200);
// 连接WiFi
WiFi.begin(ssid, password);
Serial.println("连接WiFi...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi连接成功");
// 连接到MQTT服务器
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
while (!client.connected()) {
Serial.println("连接到MQTT服务器...");
if (client.connect(clientName, mqtt_username, mqtt_password)) {
Serial.println("MQTT服务器连接成功");
// 订阅主题
client.subscribe(topic);
} else {
Serial.print("MQTT服务器连接失败,错误代码=");
Serial.print(client.state());
Serial.println(" 重新连接中...");
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}
void reconnect() {
// 重新连接到MQTT服务器
while (!client.connected()) {
Serial.println("重新连接到MQTT服务器...");
if (client.connect(clientName, mqtt_username, mqtt_password)) {
Serial.println("MQTT服务器连接成功");
// 订阅主题
client.subscribe(topic);
} else {
Serial.print("MQTT服务器连接失败,错误代码=");
Serial.print(client.state());
Serial.println(" 重新连接中...");
delay(5000);
}
}
}
烧写成功后就会发现当点击开启时esp8266的贴片led亮了,点击关闭时esp8266的贴片led灭了,这说明我们搭建成功了。下面这段代码是判断接收到数据后是否要亮灯的。
if ((char)payload[0] == '1') {
digitalWrite(BUILTIN_LED, LOW); // 亮灯
} else {
digitalWrite(BUILTIN_LED, HIGH); // 熄灯
}
因为贴片led低电平点亮所以亮灯应该是上面的代码,要注意!
点开启蓝色led灯亮。
点关闭蓝色led灯灭。
打开串口监视器
这就说明我们搭建的MQTT服务器成功了!
我们继续延申。加入一个dht11温湿度传感器,把温湿度上传至物联网平台。
以下是esp8266代码
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "dht.h"
dht DHT;
float h,t;
// WiFi信息
const char* ssid = "loushi";
const char* password = "88888888";
// MQTT服务器信息
const char* mqtt_server = "192.168.31.76";
const int mqtt_port = 1883;
const char* mqtt_username = "admin";
const char* mqtt_password = "11111111";
// 客户端信息
const char* client_id = "ip_3";
const char* subscribe_topic = "ad";
// DHT传感器信息
#define DHTPIN D6
#define DHTTYPE DHT11
//DHT dht(DHTPIN, DHTTYPE);
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[5];
int value = 0;
void setup_wifi() {
delay(10);
// Connect to 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("] ");
// 将payload转换为整数
int payloadValue = (char)payload[0] - '0';
Serial.println(payloadValue);
// 根据payload值控制LED
if (payloadValue == 1) {
digitalWrite(LED_BUILTIN, HIGH); // 点亮LED
} else {
digitalWrite(LED_BUILTIN, LOW); // 熄灭LED
}
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect(client_id, mqtt_username, mqtt_password)) {
Serial.println("connected");
client.publish("weather/temp","init...");
client.publish("weather/humidity","init...");
// Once connected, subscribe to the topic
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() {
pinMode(DHTPIN,INPUT);
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT); // 设置LED引脚为输出
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
// dht.begin();
}
void loop() {
DHT.read(DHTPIN);
h = DHT.humidity;
t = DHT.temperature;
Serial.print("温度:");
Serial.println(t);
delay(1000);
Serial.print("湿度:");
Serial.print(h);
Serial.println("%");
delay(1000);
if (!client.connected()) {
reconnect();
}
client.loop();
long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t Temperature: ");
Serial.print(t);
Serial.println(" *C");
// 发送温度数据
// snprintf(msg, 4, 3, t);
dtostrf(t,4,3,msg);
// char buffer[10];
// char buffer2[10];
// itoa(t, buffer, 10);
client.publish("weather/temp", msg);
dtostrf(h,4,3,msg);
// 发送湿度数据
//snprintf(msg, 4, 3, h);
//itoa(h, buffer2, 10);
client.publish("weather/humidity", msg);
}
}
其中dht的库需要用我的,把他们放到同一个文件夹里面
将下面代码放到.txt文件里后保存把扩展名改成.cpp即可
//
// FILE: dht.cpp
// VERSION: 0.1.01
// PURPOSE: DHT Temperature & Humidity Sensor library for Arduino
//
// DATASHEET:
//
// HISTORY:
// 0.1.01 added support for Arduino 1.0, fixed typos (31/12/2011)
// 0.1.0 by Rob Tillaart (01/04/2011)
// inspired by DHT11 library
//
#include "dht.h"
#define TIMEOUT 10000
void dht::read(uint8_t pin)
{
// INIT BUFFERVAR TO RECEIVE DATA
uint8_t bits[5];
uint8_t cnt = 7;
uint8_t idx = 0;
// EMPTY BUFFER
for (int i=0; i< 5; i++) bits[i] = 0;
// REQUEST SAMPLE
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
delay(20);
digitalWrite(pin, HIGH);
delayMicroseconds(40);
digitalWrite(pin, LOW);
pinMode(pin, INPUT);
// GET ACKNOWLEDGE or TIMEOUT
unsigned int loopCnt = TIMEOUT;
while(digitalRead(pin) == LOW)
if (loopCnt-- == 0) break;
loopCnt = TIMEOUT;
while(digitalRead(pin) == HIGH)
if (loopCnt-- == 0) break;
// READ THE OUTPUT - 40 BITS => 5 BYTES
for (int i=0; i<40; i++)
{
loopCnt = TIMEOUT;
while(digitalRead(pin) == LOW)
if (loopCnt-- == 0) break;
unsigned long t = micros();
loopCnt = TIMEOUT;
while(digitalRead(pin) == HIGH)
if (loopCnt-- == 0) break;
if ((micros() - t) > 40) bits[idx] |= (1 << cnt);
if (cnt == 0) // next byte?
{
cnt = 7;
idx++;
}
else cnt--;
}
humidity = bits[0];
temperature =bits[2];
}
//
// END OF FILE
//
将下面代码放到新的.txt文件中,保存后改扩展名为.h
//
// FILE: dht.h
// VERSION: 0.1.01
// PURPOSE: DHT Temperature & Humidity Sensor library for Arduino
//
// URL: http://arduino.cc/playground/Main/DHTLib
//
// HISTORY:
// see dht.cpp file
//
#ifndef dht_h
#define dht_h
#if ARDUINO < 100
#include <WProgram.h>
#else
#include <Arduino.h>
#endif
#define DHT_LIB_VERSION "0.1.01"
class dht
{
public:
void read(uint8_t pin);
//int read22(uint8_t pin);
int humidity;
int temperature;
};
#endif
//
// END OF FILE
//
把dht11的DATA口接到esp8266的D6口。
接下来搭建物联网平台。添加控件。要注意使用以上代码的时候修改了订阅主题。也就是之前的“ad“。
以下是各个控件的配置
成功后就能看到以下结果。
至此主要知识就结束了。接下来就是我连接0.96寸oled和红外线学习模块实现的最终成果。