搭建本地MQTT服务器并连接esp8266实现温湿度采集红外遥控和天气时钟(中)

上次到查看物联网搭建的结果了

结果呈现这样就成功了。我们使用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和红外线学习模块实现的最终成果。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值