找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3938|回复: 2
打印 上一主题 下一主题
收起左侧

点灯科技可以定时控制的Arduino代码分享

[复制链接]
跳转到指定楼层
楼主
受限于点灯科技贫民版没有定时的苦恼,我自己在代码里面加了获取网络时间,然后根据本地设置的时间进行定时开关任务,代码里面已经备注了接线,和按键的控制方法,不明白的地方,欢迎留言讨论

  1. //接线:输出口4,按钮5,oled的SCL接2,SDA接
  2. #include <Arduino.h>
  3. #include <NTPClient.h>
  4. #include <ESP8266WiFi.h>
  5. #include <WiFiUdp.h>
  6. #include <U8g2lib.h>
  7. #ifdef U8X8_HAVE_HW_I2C
  8. #include <Wire.h>
  9. #endif
  10. #define BLINKER_WIFI
  11. #define BLINKER_DUEROS_OUTLET
  12. #include <Blinker.h>
  13. char auth[] = "76ce30884a64";
  14. char ssid[] = "MERCURY_0FE8";
  15. char pswd[] = "12345678";
  16. #define BUTTON_1 "ButtonKey"
  17. BlinkerButton Button1(BUTTON_1);
  18. const int led = 4; ////IO口
  19. uint8_t bedroomdoorswitch = 5; //按钮开关
  20. bool oState = false;
  21. String str = "";//定义字符串为空,后面会用到,你这里不定义,后面用到的时候他会告诉你字符串没有定义
  22. String hour1 = "";
  23. String min1 = "";
  24. String sec1 = "";
  25. int timeZone = 8; //东八区的时间
  26. WiFiUDP ntpUDP;
  27. #include <string.h>
  28. String sethourK = "22";//几点比如输入01表示1点,13表示13点
  29. String setminK = "15";//几分开比如输入05表示5分,22表示22分
  30. ////////////////////////////
  31. String sethourG = "22"; //几点
  32. String setminG = "16";//几分关
  33. unsigned long lastmill = 0;

  34. NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", timeZone * 3600, 60000);
  35. U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 2, /* data=*/ 0, /* reset=*/ U8X8_PIN_NONE);   // All Boards without Reset of the Display
  36. //////////////////////////////////
  37. void setup() {
  38.   Serial.begin(9600);
  39.   pinMode(bedroomdoorswitch, INPUT_PULLUP);
  40.   BLINKER_DEBUG.stream(Serial);
  41.   BLINKER_DEBUG.debugAll();
  42.   Blinker.begin(auth, ssid, pswd);
  43.   Blinker.attachData(dataRead);
  44.   BlinkerDuerOS.attachPowerState(duerPowerState);
  45.   BlinkerDuerOS.attachQuery(duerQuery);
  46.   pinMode(led, OUTPUT);
  47.   digitalWrite(led, LOW);
  48.   u8g2.begin();
  49.   u8g2.enableUTF8Print();
  50.   WiFi.begin(ssid, pswd);
  51.   while ( WiFi.status() != WL_CONNECTED ) {
  52.     delay ( 500 );
  53.     Serial.print ( "." );
  54.   }
  55.   timeClient.begin();
  56. }
  57. void button1_callback(const String & state) {
  58.   BLINKER_LOG("get button state: ", state);
  59.   if (state == BLINKER_CMD_ON) {
  60.     BLINKER_LOG("Toggle on!");
  61.     Button1.icon("icon_1");
  62.     Button1.color("#FFFFFF");
  63.     Button1.text("Your button name or describe");
  64.     Button1.print("on");
  65.     oState = true;
  66.   }
  67.   else if (state == BLINKER_CMD_OFF) {
  68.     BLINKER_LOG("Toggle off!");
  69.     Button1.icon("icon_1");
  70.     Button1.color("#FFFFFF");
  71.     Button1.text("Your button name or describe");
  72.     Button1.print("off");
  73.     oState = false;
  74.   }
  75.   BlinkerDuerOS.powerState(oState ? "on" : "off");
  76.   BlinkerDuerOS.report();
  77.   digitalWrite(led, oState);
  78. }
  79. void duerPowerState(const String & state) {
  80.   BLINKER_LOG("need set power state: ", state);
  81.   if (state == BLINKER_CMD_ON) {
  82.     digitalWrite(led, HIGH);
  83.     BlinkerDuerOS.powerState("on");
  84.     BlinkerDuerOS.print();
  85.     oState = true;
  86.   }
  87.   else if (state == BLINKER_CMD_OFF) {
  88.     digitalWrite(led, LOW);
  89.     BlinkerDuerOS.powerState("off");
  90.     BlinkerDuerOS.print();
  91.     oState = false;
  92.   }
  93. }
  94. void duerQuery(int32_t queryCode) {
  95.   BLINKER_LOG("DuerOS Query codes: ", queryCode);
  96.   switch (queryCode)
  97.   {
  98.     case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
  99.       BLINKER_LOG("DuerOS Query power state");
  100.       BlinkerDuerOS.powerState(oState ? "on" : "off");
  101.       BlinkerDuerOS.print();
  102.       break;
  103.     case BLINKER_CMD_QUERY_TIME_NUMBER :
  104.       BLINKER_LOG("DuerOS Query time");
  105.       BlinkerDuerOS.time(millis());
  106.       BlinkerDuerOS.print();
  107.       break;
  108.     default :
  109.       BlinkerDuerOS.powerState(oState ? "on" : "off");
  110.       BlinkerDuerOS.print();
  111.       break;
  112.   }
  113. }
  114. void dataRead(const String & data) {
  115.   BLINKER_LOG("Blinker readString: ", data);
  116.   BlinkerDuerOS.powerState("off");
  117.   BlinkerDuerOS.report();
  118. }
  119. void timer() {
  120.   timeClient.update();
  121.   str = timeClient.getFormattedTime();//显示获取的时间,比如22:05:20
  122.   hour1 = str.substring(0, 2); //shi//截取小时
  123.   min1 = str.substring(3, 5); //fen截取分钟
  124.   sec1 = str.substring(6, 8); //miao截取秒
  125.   /*Serial.println(timeClient.getFormattedTime());
  126.     Serial.println(hour1);//串口输出
  127.     Serial.println(min1);
  128.     Serial.println(sec1);
  129.     Serial.print("已设置开灯时间:");
  130.     Serial.print(sethourK);
  131.     Serial.print("点");
  132.     Serial.print(setminK);
  133.     Serial.println("分");
  134.     Serial.print("已设置关灯时间:");
  135.     Serial.print(sethourG);
  136.     Serial.print("点");
  137.     Serial.print(setminG);
  138.     Serial.println("分");*/
  139.   if (hour1 == sethourK and min1 == setminK) { //如果设置的小时等于获取的小时
  140.     //digitalWrite(led, HIGH);
  141.     oState =1;
  142.     Serial.println("已开灯");
  143.   }
  144.   if (hour1 == sethourG and min1 == setminG) { //如果设置的小时等于获取的小时
  145.     //digitalWrite(led, LOW);
  146.     oState =0;
  147.     Serial.println("已关灯");
  148.   }
  149. }
  150. void oled() {
  151.   u8g2.clearBuffer();
  152.   u8g2.setFont(u8g2_font_unifont_t_chinese2);  //设置OLED显示的字体,需要支持的字体才行,可以去示例里面看
  153.   u8g2.setFontDirection(0);//不知道
  154.   u8g2.clearBuffer();//清空原来存在oled的图像
  155.   u8g2.setCursor(0, 15);//设置开始显示的位置
  156.   u8g2.print("开时间:");//显示的内容,用的print,就好比打印机打印
  157.   u8g2.setCursor(58, 15);
  158.   u8g2.print(sethourK);
  159.   u8g2.setCursor(74, 15);
  160.   u8g2.print(":");
  161.   u8g2.setCursor(81, 15);
  162.   u8g2.print(setminK);
  163.   u8g2.setCursor(0, 60);//设置开始显示的位置
  164.   u8g2.print("关时间:");//显示的内容,用的print,就好比打印机打印
  165.   u8g2.setCursor(58, 60);
  166.   u8g2.print(sethourG);
  167.   u8g2.setCursor(74, 60);
  168.   u8g2.print(":");
  169.   u8g2.setCursor(81, 60);
  170.   u8g2.print(setminG);
  171.   u8g2.setFont(u8g2_font_inb16_mf);
  172.   u8g2.setCursor(0, 40);//
  173.   u8g2.print(str);    //
  174.   u8g2.sendBuffer();
  175. }
  176. void key() {
  177.   if (digitalRead(bedroomdoorswitch) == LOW)
  178.     delay(50);
  179.   if (digitalRead(bedroomdoorswitch) == LOW) {
  180.     oState = !oState;
  181.   }
  182.   while (digitalRead(bedroomdoorswitch) == LOW) {}
  183.   digitalWrite(led, oState);
  184. }
  185. void loop() {
  186.   Blinker.run();
  187.   timer();
  188.   if (lastmill - millis() > 1000) {
  189.     oled();
  190.   }
  191.   key();
  192.   lastmill = millis();
  193.   digitalWrite(led, oState);
  194. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1050762 发表于 2022-11-15 21:34 | 只看该作者
谢谢楼主分享,希望可以把实物照片和电路连接图发一下,再次感谢!
回复

使用道具 举报

无效楼层,该帖已经被删除
无效楼层,该帖已经被删除
5#
ID:21740 发表于 2022-12-11 22:29 | 只看该作者
谢谢分享!!!请问怎吗编译不成功。

2022-12-09_115053.png (10.03 KB, 下载次数: 148)

2022-12-09_115053.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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