Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1126|回复: 3

[分享] 分享我的第一个点灯程序——家庭控制中心

[复制链接]
发表于 2022-9-29 18:54 | 显示全部楼层 |阅读模式
2020年,在B站上初识ESP8266,被ESP8266的低门槛、高性价比深深吸引,2020年6月20日,买下我的第一块ESP8266开发板,开始入坑。打小就喜欢鼓捣电子设备,现在的工作也涉猎智能家居相关的产品,所以一直想把自己的家里弄得科技感强一点,于是开始一边学习,一边开始用ESP8266来实现一些智能控制的小功能,由于是我的第一个Arduino程序,所以代码比较乱,各位请见谅,不过,不得不说,Arduino的确很好上手,blinker也帮我解决了手机程序的问题。


目前主要实现了如下几项功能:
1、通过红外发射管,可控制客厅的灯光、电视机等家电;
2、通过温湿度传感器,可获取室内的温湿度数据;
3、通过光敏电阻,可获取室内的亮度信息;
4、通过WIFI接入物业的门控、梯控系统,可以解锁楼下单元门、呼叫电梯到指定的楼层;
5、配置了一块0.96吋的OLED小屏幕可显示天气信息;
6、通过点灯科技接入小度音箱,可通过小度音箱控制灯光、家电、单元门、电梯等。




模块让我塞到墙壁盒里了,先看一下手机端的截图和配套的OLED图吧。

69e1c6f3d408f8709ce0d5ab3c82f36.jpg c8eef469056d5735e2addd098a70806.jpg ed94bb9666c5b4c634e117324f722d3.jpg 6ed29e0bea2ef3f6c25ae5291c8b8f0.jpg



  1. #define BLINKER_P RINT Serial
  2. #define BLINKER_WIFI
  3. #define BLINKER_DUEROS_LIGHT
  4. #define BLINKER_WITHOUT_SSL
  5. #include <WiFiUdp.h>
  6. #include <Blinker.h>
  7. #include <IRremoteESP8266.h>
  8. #include <IRsend.h>
  9. #include "DHTesp.h"
  10. #include "OneButton.h"
  11. #include <ESP8266HTTPClient.h>
  12. #include <U8g2lib.h>

  13. #ifdef U8X8_HAVE_HW_SPI
  14. #include <SPI.h>
  15. #endif
  16. #ifdef U8X8_HAVE_HW_I2C
  17. #include <Wire.h>
  18. #endif

  19. //定义128X64四针OLED模块连接管脚
  20. U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0 , /* clock=*/ 5, /* data=*/ 4, /* reset=*/ U8X8_PIN_NONE);

  21. int flag = 0;
  22. boolean _up = false;
  23. int incomingByte =  0;//读取串口

  24. //定义GPIO
  25. #define IRPIN 14  //红外发射管 GPIO14
  26. #define K1PIN 13 //按键1 GPIO13
  27. #define K2PIN 12 //按键2 GPIO12
  28. #define K3PIN 16 //按键3 GPIO16
  29. #define K4PIN 0  //按键4 GPIO0
  30. #define DHTPIN 2 //温湿度传感器 GPIO2
  31. #define DHTTYPE DHT11

  32. OneButton button1(K1PIN, true);
  33. OneButton button2(K2PIN, true);
  34. //OneButton button3(K3PIN, true);
  35. OneButton button4(K4PIN, true);

  36. //定义WIFI密码、设备密码
  37. char auth[] = "***";
  38. char ssid[] = "***";
  39. char pswd[] = "***";

  40. //定义全局变量
  41. int lightbright = 100;               //灯光初始亮度
  42. String lightstate = "off";           //灯光初始状态
  43. int count = 0;                       //循环计数器
  44. float humi_read = 0, temp_read = 0;  //温湿度
  45. float bright ;                       //光敏电阻

  46. //初始化各模块
  47. WiFiUDP udp;                //初始化UDP
  48. IRsend irsend(IRPIN);       //初始化IR发射管
  49. DHTesp dht;                //初始化温湿度传感器

  50. //初始化APP组件
  51. BlinkerButton BtnLightPwr("btn-light-pwr");
  52. BlinkerButton BtnLightMode("btn-light-mode");
  53. BlinkerNumber NumTemp("num-temp");
  54. BlinkerNumber NumHumi("num-humi");
  55. BlinkerNumber NumBright("num-bright");
  56. BlinkerSlider Slider1("ran-bright");
  57. BlinkerButton BtnTvPwr("btn-tv-pwr");
  58. BlinkerButton BtnTvMode("btn-tv-mode");
  59. BlinkerButton BtnTvVolp("btn-tv-volp");
  60. BlinkerButton BtnTvVolm("btn-tv-volm");
  61. BlinkerButton BtnDoor0502("btn-door-0502");
  62. BlinkerButton BtnLift1004("btn-lift-1004");
  63. BlinkerButton BtnDoor0401("btn-door-0401");
  64. BlinkerButton BtnLift0302("btn-lift-0302");

  65. void dataRead(const String & data)
  66. {
  67.   BLINKER_LOG("Blinker readString: ", data);
  68.   Blinker.vibrate();
  69.   uint32_t BlinkerTime = millis();
  70.   Blinker.print("millis", BlinkerTime);
  71.   if (data.length() == 9) {
  72.     doorOpen(data);
  73.   }
  74. }


  75. //心跳包
  76. void heartbeat()
  77. {
  78.   BtnLightPwr.print(lightstate);
  79.   Slider1.print(lightbright);
  80.   NumTemp.print(temp_read);
  81.   NumHumi.print(humi_read);
  82.   NumBright.print(bright);
  83. }

  84. //图表数据
  85. void dataStorage()
  86. {
  87.   Blinker.dataStorage("temp", temp_read);
  88.   Blinker.dataStorage("humi", humi_read);
  89.   Blinker.dataStorage("bright", bright);
  90. }

  91. // app 端按下按键即会执行该函数 回调函数
  92. void BtnLightPwr_callback(const String & state) {
  93.   BLINKER_LOG("灯光开关按钮被按下: ", state);
  94.   if (state == "on") {
  95.     irsend.sendNEC(0x1FE7887);
  96.   } else if (state == "off") {
  97.     irsend.sendNEC(0x1FE48B7);
  98.   }
  99.   lightstate = state;
  100.   BlinkerDuerOS.powerState(lightstate);
  101.   BlinkerDuerOS.report();
  102.   BtnLightPwr.print(lightstate);
  103. }

  104. void BtnLightMode_callback(const String & state) {
  105.   BLINKER_LOG("灯光模式切换按钮被按下");
  106.   irsend.sendNEC(0x1FE609F);
  107.   lightbright = 100;
  108. }

  109. void BtnTvPwr_callback(const String & state) {
  110.   BLINKER_LOG("电视开关按钮被按下");
  111.   irsend.sendSony(0xa90, 12);
  112. }

  113. void BtnTvMode_callback(const String & state) {
  114.   BLINKER_LOG("电视信源切换按钮被按下");
  115.   irsend.sendSony(0xA50, 12);
  116. }

  117. void BtnTvVolp_callback(const String & state) {
  118.   BLINKER_LOG("电视音量加按钮被按下");
  119.   irsend.sendSony(0x490, 12);
  120. }

  121. void BtnTvVolm_callback(const String & state) {
  122.   BLINKER_LOG("电视音量减按钮被按下");
  123.   irsend.sendSony(0xc90, 12);
  124. }

  125. void Slider1_callback(int32_t value)
  126. {
  127.   BLINKER_LOG("灯光亮度调整为: ", value);
  128.   int temp = 0;
  129.   temp = value - lightbright;
  130.   if ( temp > 0 ) {
  131.     for (int  counter = 1; counter <= temp * 0.63; counter++) {
  132.       irsend.sendNEC(0x1FEF807);
  133.       Blinker.delay(50);
  134.     }
  135.     if (lightbright > 100) lightbright = 100;
  136.   }
  137.   else {
  138.     for (int counter = 1; counter <= -temp * 0.63; counter++) {
  139.       irsend.sendNEC(0x1FE50AF);
  140.       Blinker.delay(50);
  141.     }
  142.     if ( lightbright < 1) lightbright = 1;
  143.   }
  144.   lightbright = value;
  145.   BlinkerDuerOS.brightness(lightbright);
  146.   BlinkerDuerOS.report();
  147. }


  148. void BtnDoor0502_callback(const String & state) {
  149.   doorOpen("050210990");
  150.   Blinker.vibrate();
  151. }

  152. void BtnLift1004_callback(const String & state) {
  153.   doorOpen("050210991");
  154.   Blinker.vibrate();
  155. }

  156. void BtnDoor0401_callback(const String & state) {
  157.   doorOpen("040103020");
  158.   Blinker.vibrate();
  159. }

  160. void BtnLift0302_callback(const String & state) {
  161.   doorOpen("040103021");
  162.   Blinker.vibrate();
  163. }

  164. //小度电源类回调
  165. void duerPowerState(const String & state)
  166. {
  167.   BLINKER_LOG("小度设置灯光开关: ", state);

  168.   if (state == BLINKER_CMD_ON) {
  169.     lightstate = "on";
  170.     irsend.sendNEC(0x1FE7887);
  171.   }
  172.   else if (state == BLINKER_CMD_OFF) {
  173.     lightstate = "off";
  174.     irsend.sendNEC(0x1FE48B7);
  175.   }
  176.   BtnLightPwr.print(lightstate);
  177.   BlinkerDuerOS.powerState(lightstate);
  178.   BlinkerDuerOS.print();
  179. }

  180. //用户自定义亮度控制的回调函数:
  181. void duerBright(const String & duBright)
  182. {
  183.   BLINKER_LOG("(不生效)小度设置灯光亮度: ", duBright);
  184.   BlinkerDuerOS.brightness(100);
  185.   BlinkerDuerOS.print();

  186.   if (duBright == "99") {//开门
  187.     doorOpen("050210990");
  188.   }
  189.   else if (duBright == "98") {//叫梯
  190.     doorOpen("050210991");
  191.   }
  192. }

  193. //用户步长设置亮度的回调函数
  194. void duerRelativeBright(int32_t duBright)
  195. {
  196.   BLINKER_LOG("小度调整灯光亮度: ", duBright);

  197.   lightbright += duBright;
  198.   BlinkerDuerOS.brightness(lightbright);
  199.   BlinkerDuerOS.print();

  200.   if ( duBright > 0 ) {
  201.     for (int  counter = 1; counter <= duBright * 0.63; counter++) {
  202.       irsend.sendNEC(0x1FEF807);
  203.       Blinker.delay(50);
  204.     }
  205.     if (lightbright > 100) lightbright = 100;
  206.   }
  207.   else {
  208.     for (int counter = 1; counter <= -duBright * 0.63; counter++) {
  209.       irsend.sendNEC(0x1FE50AF);
  210.       Blinker.delay(50);
  211.     }
  212.     if ( lightbright < 1) lightbright = 1;
  213.   }
  214.   Slider1.print(lightbright);
  215. }

  216. //小度模式的设置接口
  217. void duerMode(const String & mode)
  218. {
  219.   BLINKER_LOG("小度设置灯光模式: ", mode);
  220.   BlinkerDuerOS.mode(mode);
  221.   BlinkerDuerOS.print();

  222.   if (mode == "None") {
  223.     // 切换冷暖光
  224.     irsend.sendNEC(0x1FE609F);
  225.   }
  226.   else if (mode == "SLEEP" or mode == "NIGHT") {
  227.     irsend.sendNEC(0x1FEA05F);
  228.     BtnLightPwr.print("on");
  229.     lightstate = "on";
  230.   }
  231.   else if (mode == "ENERGY_SAVING") {
  232.     // 辅助灯
  233.     irsend.sendNEC(0x1FE48B7);
  234.     Blinker.delay(50);
  235.     irsend.sendNEC(0x1FE20DF);
  236.     BtnLightPwr.print("on");
  237.     lightstate = "on";
  238.   }
  239.   else if (mode == "TV" or mode == "VIDEO") {
  240.     // 电视遥控器
  241.   }
  242.   //wsMode = mode;
  243. }

  244. void click1() {
  245.   Serial.println("Button 1 click.");
  246.   if (lightstate == "on") {
  247.     irsend.sendNEC(0x1FE48B7);
  248.     lightstate = "off";
  249.     u8g2.setPowerSave(0);
  250.     u8g2.setCursor(24, 40);
  251.     u8g2.print("关闭客厅灯");
  252.     u8g2.sendBuffer();
  253.     Blinker.delay(2000);
  254.     u8g2.clearBuffer();
  255.     u8g2.setPowerSave(1);
  256.   } else if (lightstate == "off") {
  257.     irsend.sendNEC(0x1FE7887);
  258.     lightstate = "on";
  259.     u8g2.setPowerSave(0);
  260.     u8g2.setCursor(24, 36);
  261.     u8g2.print("打开客厅灯");
  262.     u8g2.sendBuffer();
  263.     Blinker.delay(2000);
  264.     u8g2.clearBuffer();
  265.     u8g2.setPowerSave(1);
  266.   }
  267.   BlinkerDuerOS.powerState(lightstate);
  268.   BlinkerDuerOS.report();
  269.   BtnLightPwr.print(lightstate);
  270. }

  271. void click2() {
  272.   Serial.println("Button 2 click.");

  273.   time_t run_time = Blinker.runTime();
  274.   int run_d = run_time / 86400;
  275.   int run_h = (run_time - run_d * 86400) / 3600;
  276.   int run_m = (run_time - run_d * 86400 - run_h * 3600) / 60;
  277.   int run_s = run_time - run_d * 86400 - run_h * 3600 - run_m * 60;

  278.   String run_str = String(run_d) + "-" + String(run_h) + ":" + String(run_m) + ":" + String(run_s);

  279.   u8g2.setPowerSave(0);
  280.   u8g2.setCursor(0, 15);
  281.   u8g2.print("运行时间:" + run_str);
  282.   u8g2.setCursor(0, 31);
  283.   u8g2.print("室内温度:" + String(temp_read) + " ℃");
  284.   u8g2.setCursor(0, 47);
  285.   u8g2.print("室内湿度:" + String(humi_read) + " %");
  286.   u8g2.setCursor(0, 63);
  287.   u8g2.print("室内亮度:" + String(bright));
  288.   u8g2.sendBuffer();
  289.   Serial.println("显示室内温度");

  290.   WiFiClient client;
  291.   HTTPClient http;
  292.   Serial.print("[HTTP] begin...\n");
  293.   if (http.begin(client, "http://api.help.bj.cn/apis/weather/?id=101060101")) {  // HTTP

  294.     Serial.print("[HTTP] GET...\n");
  295.     // start connection and send HTTP header
  296.     int httpCode = http.GET();

  297.     // httpCode will be negative on error
  298.     if (httpCode > 0) {
  299.       // HTTP header has been send and Server response header has been handled
  300.       Serial.printf("[HTTP] GET... code: %d\n", httpCode);

  301.       // file found at server
  302.       if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
  303.         String payload = http.getString();
  304.         Serial.println(payload);
  305.         DynamicJsonDocument doc(1000);
  306.         DeserializationError error = deserializeJson(doc, payload);
  307.         JsonObject obj = doc.as<JsonObject>();
  308.         String w_weather = doc["weather"].as<char*>();  //晴
  309.         String w_temp = doc["temp"].as<char*>();        //10
  310.         String w_humidity = doc["humidity"].as<char*>();//24%
  311.         String w_wd = doc["wd"].as<char*>();            //西南风
  312.         String w_wdforce = doc["wdforce"].as<char*>();  //4级
  313.         String w_aqi = doc["aqi"].as<char*>();          //156
  314.         String w_pm25 = doc["pm25"].as<char*>();        //156

  315.         Blinker.delay(6000);

  316.         u8g2.clearBuffer();
  317.         u8g2.setCursor(0, 15);
  318.         u8g2.print("室外天气:" + w_weather);
  319.         u8g2.setCursor(0, 31);
  320.         u8g2.print("空气质量:" + w_aqi);
  321.         u8g2.setCursor(0, 47);
  322.         u8g2.print("温度:" + String(w_temp) + "℃ 湿度:" + String(w_humidity));
  323.         u8g2.setCursor(0, 63);
  324.         u8g2.print("风力:" + w_wd + w_wdforce);
  325.         u8g2.sendBuffer();
  326.         Serial.println("显示室外天气");
  327.         Blinker.delay(6000);

  328.         u8g2.clearBuffer();
  329.         u8g2.setPowerSave(1);
  330.         Serial.println("关闭屏幕");
  331.       }
  332.     } else {
  333.       Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
  334.     }
  335.     http.end();
  336.   } else {
  337.     Serial.printf("[HTTP} Unable to connect\n");
  338.   }
  339. }

  340. void click3() {
  341.   Serial.println("Button 3 click.");
  342.   doorOpen("050210990");
  343.   u8g2.setPowerSave(0);
  344.   u8g2.setCursor(24, 36);
  345.   u8g2.print("打开单元门");
  346.   u8g2.sendBuffer();
  347.   Blinker.delay(2000);
  348.   u8g2.clearBuffer();
  349.   u8g2.setPowerSave(1);
  350. }

  351. void click4() {
  352.   Serial.println("Button 4 click.");
  353.   doorOpen("050210991");

  354.   u8g2.setPowerSave(0);
  355.   u8g2.setCursor(32, 36);
  356.   u8g2.print("呼叫电梯");
  357.   u8g2.sendBuffer();
  358.   Blinker.delay(2000);
  359.   u8g2.clearBuffer();
  360.   u8g2.setPowerSave(1);
  361. }


  362. //新方法,发送给进行转发
  363. void doorOpen(const String & doorNum)
  364. {
  365.   IPAddress NewWIFIIP(192, 168, 99, 1);

  366.   String lift[] = {"0101", "0102", "0103", "0201", "0202", "0401", "0402", "0501", "0502", "0503", "0601", "0602", "0701", "0702", "0801", "0802", "0901", "0902", "1001", "1002", "1101", "1102", "1103", "1201", "1202", "1301", "1302"};
  367.   String unitNum = doorNum.substring(0, 4);
  368.   int ip = 0;
  369.   for (ip = 0; ip <= 24; ip++) {
  370.     if (unitNum == lift[ip])break;
  371.   }
  372.   String ipstr = String(ip+1);
  373.   if (ipstr.length() == 1)
  374.   {
  375.     ipstr = "0" + ipstr;
  376.   }

  377. Serial.println(ipstr);
  378.   char door[9] ;
  379.   strcpy(door, (ipstr + doorNum).c_str());
  380.   udp.beginPacket(NewWIFIIP, 20625);
  381.   udp.write(door, 11);
  382.   udp.endPacket();
  383. }

  384. void setup() {
  385.   // 初始化串口,并开启调试信息
  386.   Serial.begin(9600);
  387.   BLINKER_DEBUG.stream(Serial); //串口打印调试信息
  388.   //   BLINKER_DEBUG.debugAll();

  389.   // 初始化有LED的IO
  390.   pinMode(LED_BUILTIN, OUTPUT);  //LED_BUILTIN 宏就是开发板指示灯的io口
  391.   digitalWrite(LED_BUILTIN, HIGH);

  392.   // 初始化blinker
  393.   Blinker.begin(auth, ssid, pswd);
  394.   //Blinker.begin(auth);
  395.   Blinker.attachData(dataRead);
  396.   Blinker.attachHeartbeat(heartbeat);
  397.   Blinker.attachDataStorage(dataStorage);

  398.   BtnLightPwr.attach(BtnLightPwr_callback); //绑定按键执行回调函数
  399.   BtnLightMode.attach(BtnLightMode_callback);
  400.   BtnTvPwr.attach(BtnTvPwr_callback);
  401.   BtnTvMode.attach(BtnTvMode_callback);
  402.   BtnTvVolp.attach(BtnTvVolp_callback);
  403.   BtnTvVolm.attach(BtnTvVolm_callback);
  404.   BtnDoor0502.attach(BtnDoor0502_callback);
  405.   BtnLift1004.attach(BtnLift1004_callback);
  406.   BtnDoor0401.attach(BtnDoor0401_callback);
  407.   BtnLift0302.attach(BtnLift0302_callback);

  408.   Slider1.attach(Slider1_callback);
  409.   Slider1.print(lightbright);

  410.   BlinkerDuerOS.attachPowerState(duerPowerState); //小度语音操作注册函数
  411.   BlinkerDuerOS.attachRelativeBrightness(duerRelativeBright);
  412.   BlinkerDuerOS.attachBrightness(duerBright);
  413.   BlinkerDuerOS.attachMode(duerMode);

  414.   //红外模块初始化
  415.   irsend.begin();

  416.   //温湿度传感器初始化
  417.   dht.setup(DHTPIN, DHTesp::DHTTYPE);

  418.   button1.attachClick(click1);
  419.   button2.attachClick(click2);
  420.   //button3.attachClick(click3);
  421.   button4.attachClick(click4);

  422.   //初始化OLED
  423.   u8g2.enableUTF8Print();//必须否则中文不显示。
  424.   u8g2.begin();
  425.   u8g2.setFont(u8g2_font_wqy14_t_gb2312);
  426.   pinMode(K3PIN, INPUT);

  427.   //设备启动后需要的一些操作
  428.   Blinker.wechat("家庭网关上线", "家庭网关上线", "家庭网关上线"); //发送微信
  429.   irsend.sendNEC(0x1FE7887);                               //关灯
  430. }

  431. void loop() {
  432.   Blinker.run();  /*每次运行都会将设备收到的数据进行一次解析。
  433.                     在使用WiFi接入时,该语句也负责保持网络连接*/

  434.   if (Serial.available() > 0)
  435.   {
  436.     incomingByte = Serial.read();
  437.     BLINKER_LOG("读到:", incomingByte);

  438.     switch (incomingByte) {
  439.       case 1:
  440.         BLINKER_LOG("开灯");
  441.         BtnLightPwr_callback("on");
  442.         break;
  443.       case 2:
  444.         BLINKER_LOG("关灯");
  445.         BtnLightPwr_callback("off");
  446.         break;
  447.       case 3:
  448.         BLINKER_LOG("灯光切换模式");
  449.         irsend.sendNEC(0x1FE609F);
  450.         lightbright = 100;
  451.         break;
  452.       case 4:
  453.         BLINKER_LOG("灯亮一点");
  454.         duerRelativeBright(20);
  455.         break;
  456.       case 5:
  457.         BLINKER_LOG("灯暗一点");
  458.         duerRelativeBright(-20);
  459.         break;
  460.       case 6:
  461.         BLINKER_LOG("灯睡眠模式");
  462.         duerMode("SLEEP");
  463.         break;
  464.       case 7:
  465.         BLINKER_LOG("灯节能模式");
  466.         duerMode("ENERGY_SAVING");
  467.         break;
  468.       case 8:
  469.         BLINKER_LOG("灯冷暖光切换");
  470.         irsend.sendNEC(0x1FE609F);
  471.         break;
  472.       case 9:
  473.         BLINKER_LOG("打开/关闭电视");
  474.         irsend.sendSony(0xa90, 12);
  475.         break;
  476.       case 10:
  477.         BLINKER_LOG("电视信源切换");
  478.         irsend.sendSony(0xA50, 12);
  479.         break;
  480.       case 11:
  481.         BLINKER_LOG("电视大点声");
  482.         irsend.sendSony(0x490, 12);
  483.         break;
  484.       case 12:
  485.         BLINKER_LOG("电视小点声");
  486.         irsend.sendSony(0xc90, 12);
  487.         break;
  488.       case 13:
  489.         BLINKER_LOG("开门");
  490.         doorOpen("050210990");
  491.         break;
  492.       case 14:
  493.         BLINKER_LOG("呼叫电梯");
  494.         doorOpen("050210991");
  495.         break;
  496.       case 15:
  497.         BLINKER_LOG("激活电梯");
  498.         doorOpen("050210992");
  499.         break;
  500.       default:
  501.         Serial.println("default");
  502.     }
  503.   }

  504.   count = count + 1;
  505.   button1.tick();
  506.   button2.tick();
  507.   //button3.tick();
  508.   button4.tick();

  509.   if (digitalRead(K3PIN) == LOW)
  510.     flag = 1;
  511.   if ((digitalRead(K3PIN) == HIGH) && (flag == 1))
  512.   {
  513.     _up = true;  flag = 0;
  514.   }

  515.   if (_up)
  516.   {
  517.     _up = false;
  518.     click3();
  519.   }

  520.   if (count % 1000 == 0) {
  521.     float h = dht.getHumidity();
  522.     float t = dht.getTemperature();
  523.     if (dht.getStatusString() != "OK")
  524.     {
  525.       BLINKER_LOG("Failed to read from DHT sensor!");
  526.     }
  527.     else
  528.     {
  529.       BLINKER_LOG("湿度:", h, " %");
  530.       BLINKER_LOG("温度:", t, " ℃");
  531.       humi_read = h;
  532.       temp_read = t;
  533.     }

  534.     bright = analogRead(0);
  535.     BLINKER_LOG("亮度:", bright);
  536.   }
  537.   else if  (count > 180000) {
  538.     count = 0;

  539.   }
  540.   Blinker.delay(10);
  541. }
复制代码





 楼主| 发表于 2022-9-29 19:03 | 显示全部楼层
最近还做了一些好玩的,等有时间了,和大家分享一下。

点阵时钟


微信截图_20220929185955.png


测试仪表
微信截图_20220929190114.png

RF监听设备
333156ef3c228cafbda92b8b75c937d.jpg 0cc12ab4d2be2c776f2ba9db6bf0382.jpg

发表于 2022-11-16 07:13 | 显示全部楼层
很赞,下次去吉视传媒不知道依照楼主的信息门闸会不会自动升杆,哈哈,交个朋友~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino爱好者

GMT+8, 2023-1-27 12:09 , Processed in 0.074503 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表