鱼缸毕设 esp8266 arduino 点灯·blinker 小爱同学-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 711|回复: 5

鱼缸毕设 esp8266 arduino 点灯·blinker 小爱同学

[复制链接]
发表于 2022-9-29 01:26 | 显示全部楼层 |阅读模式
8266.png
esp8266引脚图




界面按键.jpg 界面配置.jpg 界面.jpg 2.jpg

界面配置



  1. #define BLINKER_WIFI               //支持wifi
  2. //#define BLINKER_ESP_SMARTCONFIG    //Smartconfig或者手机微信扫码自动配网,代码配网请注释此条
  3. #define BLINKER_MIOT_MULTI_OUTLET  //支持多路插座,最多4个插孔
  4. #define BLINKER_PRINT Serial       //串口协议库
  5. #define BLINKER_WITHOUT_SSL        //blinker默认使用加密方式进行远程通信,但通信加密会消耗大量的RAM,如果您对通信安全性无要求
  6.                      //可以添加宏BLINKER_WITHOUT_SSL用以获得更多可用RAM,BLINKER_WITHOUT_SSL目前仅可用于ESP8266,其他设备的RAM足以进行加密通信

  7. #include <Blinker.h>               //使用第三方Blinker库
  8. #include <Servo.h>                 //舵机库

  9. #include <OneWire.h>               //使用温度的库
  10. #include <DallasTemperature.h>     //使用温度的库



  11. char auth[] = "128679da61a7";//ed9c736dca2f
  12. char ssid[] = "TP-LINK_鲁";
  13. char pswd[] = "13198852106";
  14. /*char ssid[] = "l";
  15. char pswd[] = "12345678";*/

  16. #define Servo_pin 13  //定义舵机连接引脚D7

  17. //定义温度传感器信号
  18. #define ONE_WIRE_BUS 2                // DS18B20 DQ接ESP8266引脚D4(GPIO2)
  19. #define hot 14                        //控制加热棒继电器接ESP8266引脚D5(GPIO14)  和   void setup()中的pinMode(hot,OUTPUT);配合
  20. OneWire oneWire(ONE_WIRE_BUS);
  21. DallasTemperature sensors(&oneWire);

  22. //定义水质传感器信号
  23. #define TdsSensorPin A0               //TDS水质传感器A接ESP8266引脚A0
  24. #define VREF 5.0      // analog reference voltage(Volt) of the ADC
  25. #define SCOUNT  30             // sum of sample point
  26. int analogBuffer[SCOUNT];    // store the analog value in the array, read from ADC
  27. int analogBufferTemp[SCOUNT];
  28. int analogBufferIndex = 0, copyIndex = 0;
  29.             
  30. float averageVoltage = 0, tdsValue = 0, tdsValue_MAX  = 300 , tempe = 25 ,tempe_MAX = 28;//
  31. //int lock = 0;
  32. double temp,data;

  33. //定义继电器信号
  34. #define Relay_1 0         //定义继电器1信号接入GPIO5,D3
  35. #define Relay_2 4         //定义继电器2信号接入GPIO4,D2
  36. #define Relay_3 16         //定义继电器3信号接入GPIO0,D0
  37. #define Relay_4 12         //定义继电器4信号接入GPIO12,D6

  38. //定义水位传感器信号
  39. #define Grove_Water_Sensor 5           // S接ESP8266引脚D1(GPIO5)
  40. #define Water 15                        //继电器IN接ESP8266引脚D8(GPIO15)控制水泵开关

  41. // 新建Blinker软件组件对象
  42. BlinkerButton Button("MainSwitch");     //组件对象,要和APP组件中的“数据键名”一致,总开关
  43. BlinkerButton Button1("btn-1");       //组件对象,要和APP组件中的“数据键名”一致,开关1
  44. BlinkerButton Button2("btn-2");       //组件对象,要和APP组件中的“数据键名”一致,开关2
  45. BlinkerButton Button3("btn-3");       //组件对象,要和APP组件中的“数据键名”一致,开关3
  46. BlinkerButton Button4("btn-4");       //组件对象,要和APP组件中的“数据键名”一致,开关4
  47. BlinkerButton Button5("Refresh");       //APP端按钮状态刷新

  48. BlinkerNumber TEMP("tempe");         //定义温度  数据键名
  49. BlinkerNumber DEMP("data");         //定义水位  数据键名
  50. BlinkerNumber WATER("tdsValue");    //定义水质  数据键名
  51. BlinkerText WATERSTATUS("waterStatus");//定义水位 文本键名
  52. BlinkerText HOT("hot");                //定义加热棒 文本键名
  53. BlinkerText TDS("tds");                //定义水质 文本键名
  54. //定义插座状态,用于小爱同学状态反馈
  55. bool oState[5] = { false };
  56. #define OUTLET_ALL   0  //所有插孔
  57. #define OUTLET_NO_1  1  //插座插孔一
  58. #define OUTLET_NO_2  2  //插座插孔二
  59. #define OUTLET_NO_3  3  //插座插孔三
  60. #define OUTLET_NO_4  4  //插座插孔四


  61. //喂食量
  62. Servo servo;
  63. int feedamount = 300;
  64. int feed_EA = 1;
  65. BlinkerSlider Slider1("ran-feedamount"); //喂食量滑块(通过延时时间控制出食量)
  66. void   Slider1_feedamount(int32_t amount)
  67. {
  68.   feedamount = amount >= 1000 ? 1000 : amount <= 1 ? 1
  69.                : amount;
  70.   Slider1.print(feedamount);
  71.   BLINKER_LOG("feedamount:", feedamount);
  72. }

  73. BlinkerButton Button6("btn-handfeed"); //喂食
  74. void   Button6_callback(const String &state)
  75. {
  76.   BLINKER_LOG("get button state: ", state);
  77.   if (state == BLINKER_CMD_BUTTON_TAP && feed_EA)
  78.   {
  79.     feed_EA = 1;
  80.     BLINKER_LOG("get feedamount: ", feedamount);
  81.     feed_cat();
  82.     Blinker.vibrate(1000);    //震动1s
  83.     Button6.color("#0000FF");
  84.     Button6.text("出料完成");
  85.     Button6.print();
  86.     feed_EA = 1;
  87.   }
  88. }
  89. void feed_cat() //喂食出料
  90. {

  91. //  playmusic();
  92.   servo.write(0);
  93.   Button6.color("#FFA500");
  94.   Button6.text("出料中");
  95.   Button6.print();
  96.   Blinker.delay(50);

  97.   Blinker.delay(feedamount * 10);
  98.   servo.write(90);
  99. }


  100. //反馈继电器状态函数
  101. void RelayState(int num)
  102. {
  103.   switch(num)
  104.   {
  105.     case 1:   //插座插孔一状态
  106.         if(digitalRead(Relay_1)==LOW)
  107.         {
  108.           Button1.color("#808080");   //设置app按键是灰色,16进制颜色码
  109.           Button1.text("关灯");          //设置app按键注释“关”
  110.           Button1.print("off");
  111.           oState[1] = false;
  112.         }
  113.         else if(digitalRead(Relay_1==HIGH))
  114.         {
  115.           Button1.color("#FFA500");   //设置app按键是橙色,16进制颜色码https://www.w3school.com.cn/tags/html_ref_colornames.asp
  116.           Button1.text("开灯");          //设置app按键注释“开”
  117.           Button1.print("on");
  118.           oState[1] = true;
  119.         }
  120.         break;
  121.     case  2:
  122.         if(digitalRead(Relay_2)==LOW /*|| digitalRead(Water) == HIGH*/)
  123.         {
  124.           //lock = 1;
  125.           Button2.color("#808080");   //设置app按键是灰色,16进制颜色码
  126.           Button2.text("注水关");          //设置app按键注释“关”
  127.           Button2.print("off");
  128.           oState[2] = false;
  129.         }
  130.         else if(digitalRead(Relay_2==HIGH) /*|| digitalRead(Water) == LOW*/)
  131.         {
  132.           //lock = 0;
  133.           Button2.color("#FFA500");   //设置app按键是橙色,16进制颜色码
  134.           Button2.text("注水开");          //设置app按键注释“开”
  135.           Button2.print("on");
  136.           oState[2] = true;
  137.         }
  138.         break;
  139.     case  3:
  140.         if(digitalRead(Relay_3)==LOW)
  141.         {
  142.           Button3.color("#808080");   //设置app按键是灰色,16进制颜色码
  143.           Button3.text("排水关");          //设置app按键注释“关”
  144.           Button3.print("off");
  145.           oState[3] = false;
  146.         }
  147.         else if(digitalRead(Relay_3==HIGH))
  148.         {
  149.           Button3.color("#FFA500");   //设置app按键是橙色,16进制颜色码
  150.           Button3.text("排水开");          //设置app按键注释“开”
  151.           Button3.print("on");
  152.           oState[3] = true;
  153.         }
  154.         break;
  155.     case  4:
  156.         if(digitalRead(Relay_4)==LOW)
  157.         {
  158.           Button4.color("#808080");   //设置app按键是灰色,16进制颜色码
  159.           Button4.text("加热棒关");          //设置app按键注释“关”
  160.           Button4.print("off");
  161.           oState[4] = false;
  162.         }
  163.         else if(digitalRead(Relay_4==HIGH))
  164.         {
  165.           Button4.color("#FFA500");   //设置app按键是橙色,16进制颜色码
  166.           Button4.text("加热棒开");          //设置app按键注释“开”
  167.           Button4.print("on");
  168.           oState[4] = true;
  169.         }
  170.         break;
  171.         default:
  172.             break;
  173.   }
  174. }
  175. // 在APP控制,按下MainSwitch按键即会执行该函数
  176. void button_callback(const String & state)
  177. {
  178.     BLINKER_LOG("操作了MainSwitch: ", state);//APP中的Monitor控件打印的信息
  179.     if (state=="on")
  180.     {
  181.         ctrl_multi_outlet(OUTLET_ALL, LOW);//打开继电器--所有
  182.         // 反馈继电器状态
  183.         Button.color("#FFA500");   //设置app按键是橙色,16进制颜色码
  184.         Button.text("开");          //设置app按键注释“开”
  185.         Button.icon("fal fa-power-on");
  186.         Button.print("on");
  187.         Blinker.vibrate();  //开启继电器时反馈,让手机震动
  188.     } else if(state=="off")
  189.     {
  190.         ctrl_multi_outlet(OUTLET_ALL, HIGH);//关闭继电器--所有
  191.         // 反馈继电器状态
  192.         Button.color("#808080");   //设置app按键是橙色,16进制颜色码
  193.         Button.text("关");          //设置app按键注释“开”
  194.         Button.icon("fal fa-power-off");
  195.         Button.print("off");
  196.     }
  197. }

  198. // 在APP控制,按下Switch1按键即会执行该函数--第1路开关
  199. void button1_callback(const String & state)
  200. {
  201.     BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息
  202.     if (state=="on")
  203.     {
  204.         ctrl_multi_outlet(OUTLET_NO_1,HIGH );//打开继电器--第1路
  205.         // 反馈继电器状态
  206.         RelayState(1);    //调用继电器反馈程序
  207.     } else if(state=="off")
  208.     {
  209.         ctrl_multi_outlet(OUTLET_NO_1, LOW);//关闭继电器--第1路
  210.         // 反馈继电器状态
  211.         RelayState(1);    //调用继电器反馈程序
  212.     }
  213. }

  214. // 在APP控制,按下Switch2按键即会执行该函数--第2路开关
  215. void button2_callback(const String & state)
  216. {
  217.     BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息
  218.     if (state=="on")
  219.     {
  220.         ctrl_multi_outlet(OUTLET_NO_2,HIGH );//打开继电器--第2路
  221.         // 反馈继电器状态
  222.         RelayState(2);    //调用继电器反馈程序
  223.     } else if(state=="off")
  224.     {
  225.         ctrl_multi_outlet(OUTLET_NO_2,LOW );//关闭继电器--第2路
  226.         // 反馈继电器状态
  227.         RelayState(2);    //调用继电器反馈程序
  228.     }
  229. }

  230. // 在APP控制,按下Switch3按键即会执行该函数--第3路开关
  231. void button3_callback(const String & state)
  232. {
  233.     BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息
  234.     if (state=="on")
  235.     {
  236.         ctrl_multi_outlet(OUTLET_NO_3, HIGH);//打开继电器--第3路
  237.         // 反馈继电器状态
  238.         RelayState(3);    //调用继电器反馈程序
  239.     } else if(state=="off")
  240.     {
  241.         ctrl_multi_outlet(OUTLET_NO_3, LOW);//关闭继电器--第3路
  242.         // 反馈继电器状态
  243.         RelayState(3);    //调用继电器反馈程序
  244.     }
  245. }

  246. // 在APP控制,按下Switch4按键即会执行该函数--第4路开关
  247. void button4_callback(const String & state)
  248. {
  249.     BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息
  250.     if (state=="on")
  251.     {
  252.         ctrl_multi_outlet(OUTLET_NO_4, HIGH);//打开继电器--第4路
  253.         // 反馈继电器状态
  254.         RelayState(4);    //调用继电器反馈程序
  255.     } else if(state=="off")
  256.     {
  257.         ctrl_multi_outlet(OUTLET_NO_4, LOW);//关闭继电器--第4路
  258.         // 反馈继电器状态
  259.         RelayState(4);    //调用继电器反馈程序
  260.     }
  261. }

  262. //APP端状态手动刷新按钮
  263. void button5_callback(const String & state)
  264. {
  265.   for(int i=0;i<5;i++)
  266.   {
  267.     RelayState(i);
  268.   }
  269. }
  270. //小爱同学控制插座多个插孔
  271. void ctrl_multi_outlet(uint8_t num, uint8_t io_level)
  272. {
  273.     switch (num)
  274.         {
  275.             case 0:  //所有插孔
  276.                 digitalWrite(Relay_1, io_level);//控制继电器1
  277.                 digitalWrite(Relay_2, io_level);//控制继电器2
  278.                 digitalWrite(Relay_3, io_level);//控制继电器3
  279.                 digitalWrite(Relay_4, io_level);//控制继电器4
  280.                 break;
  281.             case 1:  //插座插孔一
  282.                 digitalWrite(Relay_1, io_level);//控制继电器1
  283.                 break;
  284.             case 2:  //插座插孔二
  285.                 digitalWrite(Relay_2, io_level);//控制继电器2
  286.                 break;
  287.             case 3:  //插座插孔三
  288.                 digitalWrite(Relay_3, io_level);//控制继电器3
  289.                 break;
  290.             case 4:  //插座插孔四
  291.                 digitalWrite(Relay_4, io_level);//控制继电器4
  292.                 break;
  293.             default:
  294.                 break;
  295.         }
  296. }

  297. //小爱电源类回调,例如:“打开插座”、“打开插座插孔一”、“打开插座插孔二”
  298. void miotPowerState(const String & state, uint8_t num)
  299. {
  300.     BLINKER_LOG("need set outlet: ", num, ", power state: ", state);

  301.     if (state == BLINKER_CMD_ON)
  302.     {
  303.         ctrl_multi_outlet(num, LOW);//打开继电器,num表示是多少路(继电器低电平出发)
  304.         BlinkerMIOT.powerState("on", num);
  305.         BlinkerMIOT.print();
  306.         RelayState(num);

  307.         oState[num] = true;
  308.     }
  309.    else if (state == BLINKER_CMD_OFF)
  310.     {
  311.         ctrl_multi_outlet(num, HIGH);//关闭继电器,num表示是多少路

  312.         BlinkerMIOT.powerState("off", num);
  313.         BlinkerMIOT.print();
  314.         RelayState(num);

  315.         oState[num] = false;
  316.     }
  317. }

  318. //小爱设备查询的回调函数,查询设备状态,例如:“插座插孔一状态”
  319. void miotQuery(int32_t queryCode,uint8_t num)
  320. {
  321.     BLINKER_LOG("插孔",num,"状态",",codes:", queryCode);

  322.     switch (num)
  323.     {
  324.          case 0 :
  325.             BLINKER_LOG("状态:");
  326.             BlinkerMIOT.powerState(oState[1] ? "on" : "off");
  327.             BlinkerMIOT.powerState(oState[2] ? "on" : "off");
  328.             BlinkerMIOT.powerState(oState[3] ? "on" : "off");
  329.             BlinkerMIOT.powerState(oState[4] ? "on" : "off");
  330.             BlinkerMIOT.print();
  331.             break;
  332.          case 1 :
  333.             BLINKER_LOG("插孔1状态:");
  334.             BlinkerMIOT.powerState(oState[1] ? "on" : "off");
  335.             BlinkerMIOT.print();
  336.             break;
  337.          case 2 :
  338.             BLINKER_LOG("插孔2状态:");
  339.             BlinkerMIOT.powerState(oState[2] ? "on" : "off");
  340.             BlinkerMIOT.print();
  341.             break;
  342.          case 3 :
  343.             BLINKER_LOG("插孔3状态:");
  344.             BlinkerMIOT.powerState(oState[3] ? "on" : "off");
  345.             BlinkerMIOT.print();
  346.             break;
  347.          case 4 :
  348.             BLINKER_LOG("插孔4状态:");
  349.             BlinkerMIOT.powerState(oState[4] ? "on" : "off");
  350.             BlinkerMIOT.print();
  351.             break;
  352.          default :
  353.             BlinkerMIOT.powerState(oState[1] ? "on" : "off");
  354.             BlinkerMIOT.powerState(oState[2] ? "on" : "off");
  355.             BlinkerMIOT.powerState(oState[3] ? "on" : "off");
  356.             BlinkerMIOT.powerState(oState[4] ? "on" : "off");
  357.             BlinkerMIOT.print();
  358.             break;
  359.     }
  360. }



  361. //心跳包刷新状态
  362. void heartbeat()
  363. {
  364.   for(int i=0;i<5;i++)
  365.   {
  366.     RelayState(i);
  367.   }
  368.    TEMP.print(tempe);        //给blinkerapp回传温度数据
  369.    WATER.print(tdsValue);        //给blinkerapp回传水质数据
  370.    DEMP.print(data);           //给blinkerapp回传水位数据
  371. }
  372. //显示图表
  373. void dataRead(const String & data)
  374. {
  375.     BLINKER_LOG("Blinker readString: ", data);

  376.     uint32_t BlinkerTime = millis();

  377.     Blinker.vibrate();        
  378.     Blinker.print("millis", BlinkerTime);

  379.     digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  380. }
  381. void dataStorage()
  382. {
  383.   Blinker.dataStorage("tempe",tempe);      //app显示图表温度
  384.   Blinker.dataStorage("tdsValue",tdsValue);   //app显示图表水质
  385.   Blinker.dataStorage("data",data);           //app显示图表水位
  386. }//图表 https://blog.csdn.net/weixin_64583141/article/details/125903980

  387. void setup()
  388. {
  389.     // 初始化串口,用于调试,后期可删除
  390.     Serial.begin(115200);
  391.     BLINKER_DEBUG.stream(Serial);
  392.     BLINKER_DEBUG.debugAll();

  393.     servo.attach(13);//舵机接口D7
  394.     servo.write(90);//360度舵机静止
  395.     Slider1.attach(Slider1_feedamount);

  396.     Button6.attach(Button6_callback);
  397.    
  398.     // 初始化有继电器的IO
  399.     pinMode(Relay_1, OUTPUT);
  400.     pinMode(Relay_2, OUTPUT);
  401.     pinMode(Relay_3, OUTPUT);
  402.     pinMode(Relay_4, OUTPUT);
  403.     //初始化继电器初始状态
  404.     digitalWrite(Relay_1, HIGH);       //继电器为低电平触发,初始化为HIGH
  405.     digitalWrite(Relay_2, HIGH);
  406.     digitalWrite(Relay_3, HIGH);
  407.     digitalWrite(Relay_4, HIGH);
  408.    
  409.     //初始化blinker
  410.    // Blinker.begin(auth);              //手机配网用这段
  411.    
  412.     Blinker.attachData(dataRead);            //图表数据获取
  413.     Blinker.attachDataStorage(dataStorage);
  414.    
  415.     Blinker.begin(auth, ssid, pswd);//代码配网用这段
  416.     Button.attach(button_callback);   //绑定按键回调
  417.     Button1.attach(button1_callback); //绑定按键回调
  418.     Button2.attach(button2_callback); //绑定按键回调
  419.     Button3.attach(button3_callback); //绑定按键回调
  420.     Button4.attach(button4_callback); //绑定按键回调
  421.     Button5.attach(button5_callback);
  422.    
  423.     //小爱同学注册回调
  424.     BlinkerMIOT.attachPowerState(miotPowerState); //注册小爱电源回调
  425.     BlinkerMIOT.attachQuery(miotQuery);           //小爱设备查询的回调函数
  426.    
  427.     //心跳包,初始化
  428.     Blinker.attachHeartbeat(heartbeat);           //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态
  429.   
  430.   sensors.begin();
  431.   pinMode(TdsSensorPin, INPUT);
  432.   pinMode(hot,OUTPUT);
  433.   pinMode(Grove_Water_Sensor, INPUT); // The Water Sensor is an Input
  434.   pinMode(Water, OUTPUT); // The LED is an Output加热棒继电器打开
  435. }

  436. void loop()
  437. {

  438.   Blinker.run();

  439.    //获取水位cm
  440.   temp=(long)analogRead(5);//传感器连接引脚gpio5,D1
  441.   //根据最大值时候的模拟值计算出当前实际值
  442.   //data=(temp/650)*4;//最高4cm
  443.   //data=(temp/650)*20;//最高31.48cm
  444.   data=(temp/650)*10;//最高15.74cm
  445.   Serial.print("the depth is:");
  446.   Serial.print(data);
  447.   Serial.println("cm");
  448.   DEMP.print(data);
  449.   //获取水质
  450.   static unsigned long analogSampleTimepoint = millis();
  451.   if (millis() - analogSampleTimepoint > 40U)  //every 40 milliseconds,read the analog value from the ADC
  452.   {
  453.     analogSampleTimepoint = millis();
  454.     analogBuffer[analogBufferIndex] = analogRead(TdsSensorPin);    //read the analog value and store into the buffer
  455.     analogBufferIndex++;
  456.     if (analogBufferIndex == SCOUNT)
  457.       analogBufferIndex = 0;
  458.   }
  459.   static unsigned long printTimepoint = millis();
  460.   if (millis() - printTimepoint > 800U)
  461.   {
  462.     printTimepoint = millis();
  463.     for (copyIndex = 0; copyIndex < SCOUNT; copyIndex++)
  464.       analogBufferTemp[copyIndex] = analogBuffer[copyIndex];
  465.     averageVoltage = getMedianNum(analogBufferTemp, SCOUNT) * (float)VREF / 1024.0; // read the analog value more stable by the median filtering algorithm, and convert to voltage value
  466.     float compensationCoefficient = 1.0 + 0.02 * (tempe - 25.0); //temperature compensation formula: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.02*(fTP-25.0));
  467.     float compensationVolatge = averageVoltage / compensationCoefficient; //temperature compensation
  468.     tdsValue = (133.42 * compensationVolatge * compensationVolatge * compensationVolatge - 255.86 * compensationVolatge * compensationVolatge + 857.39 * compensationVolatge) * 0.5; //convert voltage value to tds value
  469.     if(tdsValue < tdsValue_MAX){
  470.     //digitalWrite(hot,HIGH);
  471.     TDS.print("鱼缸水质硬度正常");
  472.   }else{
  473.     //digitalWrite(hot,LOW);
  474.     TDS.color("#FF0000");   //设置app按键是纯红色,16进制颜色码
  475.     TDS.print("鱼缸水质偏高");
  476.     Blinker.vibrate(1000);  //鱼缸水质偏高时反馈,让手机震动
  477.   }
  478.     Serial.print("voltage:");
  479.     Serial.print(averageVoltage,2);
  480.     Serial.print("V   ");
  481.     Serial.print("TDS Value:");
  482.     Serial.print(tdsValue, 0);
  483.     Serial.println("ppm");
  484.     WATER.print(tdsValue);
  485.   }
  486.   getTemperature();
  487.   //Blinker.delay(500);
  488.   getWaterHight();

  489. }
  490. //获取水位
  491. void getWaterHight(){
  492. /*   if(lock == 0){
  493.         Serial.println("按钮已经关闭了");
  494.         if( digitalRead(Grove_Water_Sensor) == HIGH) {
  495.           digitalWrite(Water,LOW);
  496.           WATERSTATUS.print("鱼缸水位正常,注水泵已关闭");
  497.        }else {
  498.           WATERSTATUS.color("#FF0000");   //设置app按键是纯红色,16进制颜色码
  499.           digitalWrite(Water,HIGH);
  500.           WATERSTATUS.print("鱼缸水位低,注水泵已打开");
  501.        }
  502.    }else{
  503.         Serial.println("按钮已经开启 自动模式失效");
  504.     }*/

  505.         if( digitalRead(Grove_Water_Sensor) == HIGH) {
  506.           digitalWrite(Water,LOW);
  507.           WATERSTATUS.print("鱼缸水位正常,注水泵已关闭");
  508.        }else {
  509.           WATERSTATUS.color("#FF0000");   //设置app按键是纯红色,16进制颜色码
  510.           digitalWrite(Water,HIGH);
  511.           WATERSTATUS.print("鱼缸水位低,注水泵已打开");
  512.        }

  513. }
  514. //获取温度并赋值
  515. void getTemperature(){
  516.   sensors.requestTemperatures(); // 发送命令获取温度
  517.   //Serial.print("temperature: ");
  518.   tempe= (float)sensors.getTempCByIndex(0);
  519.   if(tempe < tempe_MAX){
  520.     HOT.color("#FF0000");   //设置app按键是纯红色,16进制颜色码
  521.     digitalWrite(hot,HIGH);
  522.     HOT.print("鱼缸水温低于28℃,加热棒已打开");
  523.   }else{
  524.     digitalWrite(hot,LOW);
  525.     HOT.print("鱼缸水温正常,加热棒已关闭");
  526.   }
  527.   Serial.print("the temperature is:");
  528.   Serial.print(tempe);
  529.   Serial.println(" ℃");
  530.   TEMP.print(tempe);
  531. }

  532. int getMedianNum(int bArray[], int iFilterLen)
  533. {
  534.   int bTab[iFilterLen];
  535.   for (byte i = 0; i < iFilterLen; i++)
  536.     bTab[i] = bArray[i];
  537.   int i, j, bTemp;
  538.   for (j = 0; j < iFilterLen - 1; j++)
  539.   {
  540.     for (i = 0; i < iFilterLen - j - 1; i++)
  541.     {
  542.       if (bTab[i] > bTab[i + 1])
  543.       {
  544.         bTemp = bTab[i];
  545.         bTab[i] = bTab[i + 1];
  546.         bTab[i + 1] = bTemp;
  547.       }
  548.     }
  549.   }
  550.   if ((iFilterLen & 1) > 0)
  551.     bTemp = bTab[(iFilterLen - 1) / 2];
  552.   else
  553.     bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2;
  554.   return bTemp;
  555. }
复制代码





发表于 2022-9-30 16:04 | 显示全部楼层
楼主,app页面上的配置代码有教程码?
 楼主| 发表于 2022-9-30 16:06 | 显示全部楼层
shili 发表于 2022-9-30 16:04
楼主,app页面上的配置代码有教程码?

点灯app直接可以拖组件
发表于 2022-9-30 16:06 | 显示全部楼层
感谢 楼主无私奉献,
发表于 2022-10-10 15:15 | 显示全部楼层
你好,我也在做这个。不过没你那么多传感器。水位我原来用的是浮子开关,不知道这用的是哪个型号的水位传感器跟TDS?
 楼主| 发表于 2022-10-12 16:39 | 显示全部楼层
Delay_mx 发表于 2022-10-10 15:15
你好,我也在做这个。不过没你那么多传感器。水位我原来用的是浮子开关,不知道这用的是哪个型号的水位传感 ...

水位传感器就是1块钱一个那个 容易腐蚀 可以买一个非接触式的液体传感器
水质是模拟TDS水质传感器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:42 , Processed in 0.110092 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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