跋扈洋

  • 145 主题
  • 286 帖子
  • 1514 积分
  • 身份:版主
  • 论坛新秀
  • E币:278

《原创》50元以内智能家居之远程控制家中灯的亮灭并获取家中温湿度

2021-1-7 17:28:29 显示全部楼层
本帖最后由 跋扈洋 于 2021-1-7 17:39 编辑



介绍

如今,智能家居发展愈演愈烈,我们的生活呢已经被改变。我们都想要一个更加智能的家居生活。我们平时不在家时,比如上班或者出去旅游的时候。总是担心家中的灯没有关(尤其是我这样的强迫症)。那么今天我来分享一个非常简单的智能家居设计,只需要很少的费用(50元左右)就可以制作一款远程控制的智能家居项目。


功能

本项目集上传温湿度传感器数据到远端,与远端反向控制家中LED灯。

功能说明:上电后,DHT11温湿度传感器不断获取周围的温湿度等状态值并把数据发送到物联网数据平台,在平台上通过反向控制的方式控制LED灯的亮灭和蜂鸣器的开闭,可在串口看到相关响应;

本例采用TCP协议,通过WiFi透传模式进行远端控制与传输,基于ESPDuino开发板,应用于iot.doit.am物联网平台,采用读取DHT11温湿度采集模块采集到的数据发送到远端(平台)、远端控制LED灯和蜂鸣器演示远端控制

硬件连接

DHT11温湿度传感器–D4
LED灯–D5
有源蜂鸣器–D12

程序
  1. #include <ESP8266WiFi.h>
  2. #define u8 unsigned char
  3. //IO方向设置
  4. #define DHT11_IO_IN()  pinMode(4, INPUT)
  5. #define DHT11_IO_OUT() pinMode(4, OUTPUT)
  6. IO操作函数
  7. #define DHT11_DQ_OUT 4 //数据端口 4
  8. #define DHT11_DQ_IN  4  //数据端口 4

  9. //LED
  10. #define led 5
  11. //Beep
  12. #define beep 12

  13. //所连接的WiFi热点账密
  14. const char* ssid     = "Doit";
  15. const char* password = "doit3305";

  16. //数据接收的网络平台
  17. const char* host = "iot.doit.am";//物联网平台
  18. const int httpPort = 8810;
  19. //登录平台的 用户名 与 秘钥Key (随机数)
  20. const char* streamId   = "lin";
  21. const char* privateKey = "dee5d879314b54dca7813364ff94b79a";

  22. char str[512];//接收数据缓冲区
  23. WiFiClient client;// 使用WiFi客户端类创建TCP连接
  24. //反向控制:
  25. unsigned long MS_TIMER = 0;
  26. unsigned long lastMSTimer = 0;
  27. String comdata = "";
  28. char flag = false;

  29. /*******************************DHT11协议****************************************/
  30. u8 temperature;
  31. u8 humidity;
  32. u8 t = 0;
  33. //复位DHT11
  34. void DHT11_Rst(void)
  35. {
  36.   DHT11_IO_OUT();   //SET OUTPUT
  37.   digitalWrite(DHT11_DQ_OUT, LOW);   //拉低DQ
  38.   delay(20);     //拉低至少18ms
  39.   digitalWrite(DHT11_DQ_OUT, HIGH);   //DQ=1
  40.   delayMicroseconds(30);       //主机拉高20~40us
  41. }
  42. //等待DHT11的回应
  43. //返回1:未检测到DHT11的存在
  44. //返回0:存在
  45. u8 DHT11_Check(void)
  46. {
  47.   u8 retry = 0;
  48.   DHT11_IO_IN();//SET INPUT
  49.   while (digitalRead(DHT11_DQ_IN) && retry < 100) //DHT11会拉低40~80us
  50.   {
  51.     retry++;
  52.     delayMicroseconds(1);
  53.   };
  54.   if (retry >= 100)return 1;
  55.   else retry = 0;
  56.   while (!digitalRead(DHT11_DQ_IN) && retry < 100) //DHT11拉低后会再次拉高40~80us
  57.   {
  58.     retry++;
  59.     delayMicroseconds(1);
  60.   };
  61.   if (retry >= 100)return 1;
  62.   return 0;
  63. }
  64. //从DHT11读取一个位
  65. //返回值:1/0
  66. u8 DHT11_Read_Bit(void)
  67. {
  68.   u8 retry = 0;
  69.   while (digitalRead(DHT11_DQ_IN) && retry < 100) //等待变为低电平
  70.   {
  71.     retry++;
  72.     delayMicroseconds(1);
  73.   }
  74.   retry = 0;
  75.   while (!digitalRead(DHT11_DQ_IN) && retry < 100) //等待变高电平
  76.   {
  77.     retry++;
  78.     delayMicroseconds(1);
  79.   }
  80.   delayMicroseconds(40);//等待40us
  81.   if (digitalRead(DHT11_DQ_IN))return 1;
  82.   else return 0;
  83. }
  84. //从DHT11读取一个字节
  85. //返回值:读到的数据
  86. u8 DHT11_Read_Byte(void)
  87. {
  88.   u8 i, dat;
  89.   dat = 0;
  90.   for (i = 0; i < 8; i++)
  91.   {
  92.     dat <<= 1;
  93.     dat |= DHT11_Read_Bit();
  94.   }
  95.   return dat;
  96. }
  97. //从DHT11读取一次数据
  98. //temp:温度值(范围:0~50°)
  99. //humi:湿度值(范围:20%~90%)
  100. //返回值:0,正常;1,读取失败
  101. u8 DHT11_Read_Data(u8 *temp, u8 *humi)
  102. {
  103.   u8 buf[5];
  104.   u8 i;
  105.   DHT11_Rst();
  106.   if (DHT11_Check() == 0)
  107.   {
  108.     for (i = 0; i < 5; i++) //读取40位数据
  109.     {
  110.       buf[i] = DHT11_Read_Byte();
  111.     }
  112.     if ((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])
  113.     {
  114.       *humi = buf[0];
  115.       *temp = buf[2];
  116.     }
  117.   } else return 1;
  118.   return 0;
  119. }
  120. //初始化DHT11的IO口 DQ 同时检测DHT11的存在
  121. //返回1:不存在
  122. //返回0:存在
  123. u8 DHT11_Init(void)
  124. {
  125.   pinMode(4, OUTPUT);
  126.   DHT11_Rst();
  127.   return DHT11_Check();
  128. }
  129. /********************************************************************/

  130. //各种传感器的初始化
  131. void sensor_init()
  132. {
  133.   //LED灯
  134.   pinMode(led, OUTPUT);
  135.   digitalWrite(led, LOW);
  136.   //蜂鸣器
  137.   pinMode(beep, OUTPUT);
  138.   digitalWrite(beep, HIGH);
  139. }

  140. void setup()
  141. {
  142.   Serial.begin(115200);
  143.   sensor_init();
  144.   MS_TIMER = millis();
  145.   //DHT11
  146.   delay(10);
  147.   if (DHT11_Init()) //DHT11初始化
  148.   {
  149.     Serial.println("DHT11 Error");
  150.     delay(200);
  151.   }
  152.   Serial.println("DHT11 OK");

  153.   //  wifi_station_set_auto_connect(0);//关闭自动连接
  154.   WiFi.disconnect();/
  155.   // 首先,我们连接到WiFi网络
  156.   Serial.println();
  157.   Serial.println();
  158.   Serial.print("Connecting to ");
  159.   Serial.println(ssid);
  160.   WiFi.begin(ssid, password);
  161.   while (WiFi.status() != WL_CONNECTED)
  162.   {
  163.     delay(500);
  164.     Serial.print(".");
  165.   }
  166.   Serial.println("");
  167.   Serial.println("WiFi connected");
  168.   Serial.println("IP address: ");
  169.   Serial.println(WiFi.localIP());
  170.   delay(50);
  171.   Serial.print("connecting to ");
  172.   Serial.println(host);

  173.   // 使用WiFi客户端类创建TCP连接
  174.   //  WiFiClient client;
  175.   if (!client.connect(host, httpPort))
  176.   {
  177.     Serial.println("connection failed");
  178.     return;
  179.   }
  180. }
  181. unsigned long lastTick = 0;
  182. void loop()
  183. {
  184.   if (flag == false)
  185.   {
  186.     if (millis() - MS_TIMER > 5000)
  187.     {
  188.       MS_TIMER = millis();
  189.     }
  190.   }

  191.   //读传感器并发送
  192.   //5s读一次
  193.   if (millis() - lastTick > 5000)
  194.   {
  195.     lastTick = millis();
  196.     static bool first_flag = true;
  197.     if (first_flag)
  198.     {
  199.       first_flag = false;
  200.       sprintf(str, "cmd=subscribe&topic=lin\r\n");//注册用户名,以让后面的反向控制得以是实现
  201.       client.print(str);
  202.       return;
  203.     }
  204.     //读传感器并发送
  205.     DHT11_Read_Data(&temperature, &humidity); //读取温湿度值
  206.     Serial.print("  Temp:");
  207.     Serial.print(temperature);
  208.     Serial.print("'C");
  209.     Serial.print("  Humi:");
  210.     Serial.print(humidity);
  211.     Serial.println("%");
  212.     sprintf(str, "cmd=upload&device_name=arduino1&data=%d&device_name=arduino&data=%d&uid=lin&key=%s\r\n", humidity, temperature, privateKey);
  213.     client.print(str);
  214.   }

  215.   if (client.available())
  216.   {
  217.     //读并处理
  218.     // R读取服务器的应答的所有行,并把它们打印到串口
  219.     String recDataStr = client.readStringUntil('\n');
  220.     Serial.println(recDataStr);
  221.     //方向控制:注意LED灯是在设备arduino那里控制,蜂鸣器是在设备arduino1那里控制
  222.     if (recDataStr.compareTo("cmd=publish&device_name=arduino&device_cmd=ledon\r") == 0)
  223.     {
  224.       digitalWrite(led, HIGH);
  225.       Serial.println("LED is being open !");
  226.     }
  227.     else if (recDataStr.compareTo("cmd=publish&device_name=arduino&device_cmd=ledoff\r") == 0)
  228.     {
  229.       digitalWrite(led, LOW);
  230.       Serial.println("LED has been closed !");
  231.     }
  232.     else if (recDataStr.compareTo("cmd=publish&device_name=arduino1&device_cmd=beepon\r") == 0)
  233.     {
  234.       digitalWrite(beep, HIGH);
  235.       Serial.println("Beep is being open !");
  236.     }
  237.     else if (recDataStr.compareTo("cmd=publish&device_name=arduino1&device_cmd=beepoff\r") == 0)
  238.     {
  239.       digitalWrite(beep, LOW);
  240.       Serial.println("Beep has been closed !");
  241.     }
  242.   }
  243. }

可以看出,本程序还是非常简单的,大家可以动手制作一下。这样就可以用很少的钱来制作一个智能家居设备了。





您需要登录后才可以评论 登录 | 立即注册

最新评论

楼层直达:

二哲科技

  • 115 主题
  • 333 帖子
  • 1283 积分
  • 身份:版主
  • 论坛新秀
  • E币:1563
二哲科技 2021-1-7 20:22:30 显示全部楼层
想看一下成品的样子,可以录个小视频~

点评

可以,等闲下来录几个  详情 回复 发表于 2021-1-8 13:48

跋扈洋

  • 145 主题
  • 286 帖子
  • 1514 积分
  • 身份:版主
  • 论坛新秀
  • E币:278
跋扈洋 2021-1-8 13:48:29 显示全部楼层
二哲科技 发表于 2021-1-7 20:22
想看一下成品的样子,可以录个小视频~

可以,等闲下来录几个

fzyiye

  • 103 主题
  • 244 帖子
  • 1285 积分
  • 身份:版主
  • E币:1234
fzyiye 2021-1-11 08:19:55 显示全部楼层
开发一个专用的APP。。。。

点评

可以直接用QT做一个  详情 回复 发表于 2021-1-11 10:39
广告

跋扈洋

  • 145 主题
  • 286 帖子
  • 1514 积分
  • 身份:版主
  • 论坛新秀
  • E币:278
跋扈洋 2021-1-11 10:39:58 显示全部楼层
fzyiye 发表于 2021-1-11 08:19
开发一个专用的APP。。。。

可以直接用QT做一个

Prince

  • 0 主题
  • 9 帖子
  • 334 积分
  • 身份:LV2 初级技术员
  • E币:367

阿常

  • 2 主题
  • 50 帖子
  • 734 积分
  • 身份:实习版主
  • E币:731
阿常 2021-1-30 11:54:48 显示全部楼层
看看,学习学习。

点评

互相学习  详情 回复 发表于 2021-1-31 08:44

跋扈洋

  • 145 主题
  • 286 帖子
  • 1514 积分
  • 身份:版主
  • 论坛新秀
  • E币:278
快速回复
7
30
广告
关闭 热点推荐上一条 /2 下一条
快速回复 返回列表