安信可ESP32点灯APP自动浇花和天气空气质量-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5281|回复: 42

[分享] 安信可ESP32点灯APP自动浇花和天气空气质量

[复制链接]
发表于 2021-12-22 13:56 | 显示全部楼层 |阅读模式
本帖最后由 ht256929 于 2022-1-17 10:51 编辑

2717296B-908B-460E-BE76-0C99C4EB2656.png
本人是完全不懂C语言,大部分都是借鉴各位大佬的,没有时间和精力去学习C语言,能达到自己的使用效果就好。非常感谢各位大佬。上面是APP界面,下面是代码。错误地方多多指正新手
  1. #define BLINKER_WIFI
  2. #include <ArduinoJson.h>//此库需要放在Blinker.h库前不然会出现编译错误
  3. #include <Blinker.h>
  4. #include <DHT.h>
  5. #define JDQ 12 //继电器信号引脚
  6. #define TR 35 //土壤传感器信号引脚
  7. #define DHTPIN 25 //温湿度传感器信号引脚
  8. #define DHTTYPE DHT11 //温湿度传感器类型
  9. #define ran "SliderKey"

  10. DHT dht(DHTPIN, DHTTYPE);


  11. char auth[] = ".................";


  12. /*********************************************************************************************************
  13.   新建数据类型组件对象,作用:将数据传输到手机blinker app

  14. *********************************************************************************************************/
  15. BlinkerNumber TRZ("TRZ"); //blinker-app创建名为TRZ的数据模块显示土壤值
  16. BlinkerNumber HUMI("humi");//blinker-app创建名为humi的数据模块显示湿度值
  17. BlinkerNumber TEMP("temp");//blinker-app创建名为temp的数据模块显示温度值
  18. BlinkerNumber RSS("rssi");//blinker-app创建名为huashi的数据模块显示华式温度
  19. BlinkerNumber LU("ludian");//blinker-app创建名为ludian的数据模块显示露点值
  20. BlinkerNumber HUMISJ("humi9");//blinker-app创建名为humi9的图表显示湿度历史数据
  21. BlinkerNumber TEMPSJ("temp9");//blinker-app创建名为temp9的图标显示温度历史数据
  22. BlinkerNumber TRZSJ("TRZ9");//blinker-app创建名为TRZ9的图标显示土壤值历史数据
  23. BlinkerNumber CI("ci");
  24. BlinkerSlider Slider1("ran");
  25. BlinkerButton Button1("zhaoming");
  26. BlinkerButton Button2("jiaoshui");
  27. BlinkerText TURANG("turang");
  28. BlinkerText BENG("beng");
  29. BlinkerText YUNHANG("yunhang");
  30. BlinkerText CITY("city");
  31. BlinkerText WURAN("wuran");
  32. BlinkerText PM("pm");
  33. BlinkerText BTQX("btqx");
  34. BlinkerText WSQX("wsqx");
  35. BlinkerText BTWD("btwd");
  36. BlinkerText WSWD("wswd");
  37. BlinkerText BTFX("btfx");

  38. /*********************************************************************************************************变量*********************************************************************************************************/
  39. //天气
  40. String city1, level1, pm251, forecasts_0_date1, forecasts_0_week1, forecasts_0_dayweather1, forecasts_0_nightweather1, forecasts_0_daytemp1, forecasts_0_nighttemp1, forecasts_0_daywind1, forecasts_0_nightwind1, forecasts_0_daypower1, forecasts_0_nightpower1;//天气及空气质量
  41. int a3 = 0; //用于间隔更新天气
  42. bool first_label = false; //开机标签,开机第一时间更新天气信息

  43. //土壤值读取
  44. uint16_t LeiJi[20];//存储土壤累计读取数值
  45. uint16_t TRzhi;//土壤值
  46. uint16_t Amin = 60700; //土壤最小校准值
  47. uint16_t Amax = 24200; //土壤最大校准值

  48. //空气温湿度
  49. float  n1 = 0.0, n2 = 0.0,  t = 0, h = 0, rssi = 0;
  50. double humi_read = 0, temp_read = 0, huashi_read = 0, ludian_read = 0, ci_read = 0;

  51. //判断是否浇花
  52. String turang_read, beng_read, T, B;
  53. int ci = 0, zhi = 40;

  54. //配网设置
  55. int count = 0;     //时间计数
  56. bool WIFI_Status = true;   //WIFI状态标志位

  57. /********************************************************************************************************* Esptouch配网*********************************************************************************************************/
  58. void blinkerConnect()  //网络链接
  59. {
  60.   WiFi.begin();//没有这行命令ESP32断电重启不会自动连接WIFI
  61.   BLINKER_LOG("\r\n正在连接WIFI...");
  62.   while (WiFi.status() != WL_CONNECTED) //判断是否连接WIFI成功
  63.   {
  64.     if (WIFI_Status)
  65.     {
  66.       BLINKER_LOG("WIFI连接中");
  67.       digitalWrite(LED_BUILTIN, HIGH);
  68.       delay(500);
  69.       digitalWrite(LED_BUILTIN, LOW);
  70.       delay(500);
  71.       count++;
  72.       if (count >= 30) //5s
  73.       {
  74.         WIFI_Status = false;
  75.         BLINKER_LOG("WiFi连接失败,请用ESPtouch进行配网");
  76.       }
  77.     }
  78.     else
  79.     {
  80.       smartConfig();
  81.     }
  82.   }
  83.   BLINKER_LOG("连接成功IP地址为:", WiFi.localIP());
  84. }

  85. void smartConfig()//ESPtouch配网
  86. {
  87.   WiFi.mode(WIFI_STA);//设置STA模式
  88.   BLINKER_LOG("\r\nWait for Smartconfig...");
  89.   WiFi.beginSmartConfig();//开始SmartConfig,等待手机端发出用户名和密码
  90.   while (1)
  91.   {
  92.     BLINKER_LOG("等待配网中");
  93.     digitalWrite(LED_BUILTIN, HIGH); //指示灯闪烁
  94.     delay(1000);
  95.     digitalWrite(LED_BUILTIN, LOW); //指示灯闪烁
  96.     delay(1000);
  97.     if (WiFi.smartConfigDone()) //配网成功,接收到SSID和密码
  98.     {

  99.       BLINKER_LOG("配网成功");
  100.       BLINKER_LOG("SSID:", WiFi.SSID().c_str());
  101.       BLINKER_LOG("PSK:", WiFi.psk().c_str());
  102.       break;
  103.     }
  104.   }
  105. }

  106. /********************************************************************************************************* 土壤值读取*********************************************************************************************************/

  107. void turang()//土壤值读取
  108. {
  109.   uint8_t i;
  110.   for (i = 0; i < 20; i++) { //连续取采集多个样本,缺点AD读取会有延迟
  111.     LeiJi[i] = analogRead(TR); //读取土壤湿度传感器的值
  112.     Blinker.delay(100);
  113.   }
  114.   TRzhi = 0; //平均所有值
  115.   for (i = 0; i < 20; i++) {
  116.     TRzhi += LeiJi[i];
  117.   }
  118.   //Serial.println(TRzhi);//串口输出土壤值
  119.   TRzhi = map(TRzhi, Amin, Amax, 0, 100); //校准值转换成0-100
  120.   TRzhi = constrain(TRzhi, 0, 100); //将传感器值的范围限制在0到100之间
  121.   Blinker.delay(1000);
  122. }

  123. /*********************************************************************************************************室内温度值读取*********************************************************************************************************/

  124. // 快速计算露点,速度是5倍dewPoint()
  125. double dewPointFast(double celsius, double humidity)
  126. {
  127.   double a = 17.271;
  128.   double b = 237.7;
  129.   double temp = (a * celsius) / (b + celsius) + log(humidity / 100);
  130.   double Td = (b * temp) / (a - temp);
  131.   return Td;
  132. }

  133. void wenshidu()  //空气温湿度值读取
  134. {
  135.   float h = dht.readHumidity();
  136.   float t = dht.readTemperature();
  137.   float hic = dht.computeHeatIndex(t, h, false);
  138.   float n2 = (((9.0 / 5.0) * t + 32.0));//摄氏温度转为华式温度
  139.   float n1 = dewPointFast(dht.readTemperature(), dht.readHumidity());//计算露点
  140.   humi_read = h;//湿度值
  141.   temp_read = t;//温度值
  142.   huashi_read = n2;//华式温度
  143.   ludian_read = n1;//露点值
  144.   rssi = (WiFi.RSSI());//WIFI信号强度
  145.   Blinker.delay(1000);
  146. }

  147. /*********************************************************************************************************判断是否浇水*********************************************************************************************************/
  148. void slider1_callback(int32_t value)//读取设定自动浇水阈值,初始值为40
  149. {
  150.   BLINKER_LOG("get slider value: ", value);
  151.   zhi = value;
  152. }

  153. void gh() //读取的土壤值与设定的浇水阈值对比判断是否浇水
  154. {
  155.   if ((TRzhi < zhi) && (temp_read < 36) && (humi_read < 75)) { //如果读取土壤值小于自动浇水阈值且温度小于36度湿度低于75%则给继电器高电平信号打开水泵浇水
  156.     digitalWrite(JDQ, HIGH); //给继电器输出高电平打开水泵
  157.     Blinker.println("土壤干旱,需要浇水");
  158.     ci++;
  159.     T = "土壤干旱";
  160.     B = "水泵打开";
  161.     Blinker.delay(3000);
  162.   }

  163.   else if ((TRzhi > zhi) && (humi_read < 75)) { //如果读取土壤值大于设定浇水阈值且湿度小于75%则给继电器低电平信号关闭水泵
  164.     digitalWrite(JDQ, LOW); //关闭LED灯
  165.     Blinker.println("土壤潮湿,不需要浇水");
  166.     T = "土壤湿润";
  167.     B = "水泵关闭";
  168.     Blinker.delay(3000);
  169.   }

  170.   else if (t > 36)//如果读取温度值大于36℃则给继电器低电平信号关闭水泵
  171.   {
  172.     digitalWrite(JDQ, LOW);
  173.     Blinker.println("温度过高,不适宜浇水");
  174.     T = "温度过高不适宜浇水";
  175.     B = "水泵关闭";
  176.     Blinker.delay(3000);
  177.   }

  178.   else if (humi_read > 75)//如果读取湿度值大于75%则给继电器低电平信号关闭水泵
  179.   {
  180.     digitalWrite(JDQ, LOW);
  181.     Blinker.println("空气湿度高,可能会下雨!");
  182.     T = "空气湿度高可能会下雨";
  183.     B = "水泵关闭";
  184.     Blinker.delay(3000);
  185.   }
  186. }

  187. /*********************************************************************************************************记录历史数据*********************************************************************************************************/
  188. void dataStorage()//记录历史数据
  189. {
  190.   Blinker.dataStorage("humi9", humi_read);
  191.   Blinker.dataStorage("temp9", temp_read);
  192.   Blinker.dataStorage("TRZ9", TRzhi);
  193. }

  194. void printlf() //打印调试信息
  195. {
  196.   BLINKER_LOG("空气湿度:", humi_read, " %");
  197.   BLINKER_LOG("摄氏温度: ", temp_read, " *C");
  198.   BLINKER_LOG("华氏温度: ", huashi_read, " °F");
  199.   BLINKER_LOG("露点: ", ludian_read, " Td");
  200.   BLINKER_LOG("土壤湿度: ", TRzhi, " %");
  201.   BLINKER_LOG("浇水阈值: ", zhi, " %");
  202.   BLINKER_LOG("自动浇水次数:", ci, " 次");
  203.   BLINKER_LOG("当前土壤状态:", T, "");
  204.   BLINKER_LOG("当前水泵状态:", B, "");
  205.   BLINKER_LOG("当前WIFI信号强度:", rssi, "db");
  206. }

  207. /********************************************************************************************************* 手动浇水*********************************************************************************************************/

  208. void button2_callback(const String & state)//手动浇水
  209. {
  210.   BLINKER_LOG("get button state: ", state);
  211.   if (state == "on")
  212.   {
  213.     digitalWrite(JDQ, HIGH);
  214.     // 反馈开关状态
  215.     Button2.print("on");
  216.     B = "开始手动浇水";
  217.   }  if (state == "off") //按照例程else if无法关闭
  218.   {
  219.     digitalWrite(JDQ, LOW);
  220.     // 反馈开关状态
  221.     Button2.print("off");
  222.     B = "停止手动浇水";
  223.   }
  224.   Blinker.delay(300);
  225. }

  226. void button1_callback(const String & state) //原计划设置光照补偿(无用改为系统指示灯开关)
  227. {
  228.   BLINKER_LOG("get button state: ", state);
  229.   if (state == "on") {
  230.     digitalWrite(LED_BUILTIN, HIGH);
  231.     // 反馈开关状态
  232.     Button1.print("on");
  233.     BENG.print("系统指示灯开启");
  234.   } if (state == "off") {
  235.     digitalWrite(LED_BUILTIN, LOW);
  236.     // 反馈开关状态
  237.     Button1.print("off");
  238.     BENG.print("系统指示灯关闭");
  239.   }
  240.   Blinker.delay(300);
  241. }

  242. /*********************************************************************************************************系统运行时间*********************************************************************************************************/

  243. String rts()
  244. {
  245.   int rt = Blinker.runTime();
  246.   int r, e, f, s;
  247.   String fh;
  248.   Blinker.delay(100);
  249.   if (rt >= 86400) //天数
  250.   { r = rt / 86400;
  251.     e = rt / 3600 - r * 24;
  252.     f = rt / 60 - r * 1440 - e * 60;
  253.     s = rt - r * 86400 - e * 3600 - f * 60;
  254.   }
  255.   else if (rt >= 3600)
  256.   { r = 0;
  257.     e = rt / 3600;
  258.     f = rt / 60 - e * 60;
  259.     s = rt - e * 3600 - f * 60;
  260.   }
  261.   else
  262.   { r = 0;
  263.     e = 0;
  264.     f = rt / 60;
  265.     s = rt - f * 60;
  266.   }


  267.   if (f == 0 & e == 0 & r == 0)
  268.   {
  269.     fh = String("") + s + "秒";
  270.   }
  271.   else if (r == 0 & e == 0 )
  272.   {
  273.     fh = String("") + f + "分" + s + "秒";
  274.   }
  275.   else if (r == 0)
  276.   {
  277.     fh = String("") + e + "小时" + f + "分" + s + "秒";
  278.   }
  279.   else
  280.   {
  281.     fh = String("") + r + "天" + e + "小时" + f + "分" + s + "秒";
  282.   }

  283.   return (fh);
  284. }

  285. /*********************************************************************************************************天气数据及空气数据读取*********************************************************************************************************/
  286. void airData(const String & data) //空气质量
  287. {
  288.   BLINKER_LOG("air: ", data);
  289.   const size_t capacity = JSON_OBJECT_SIZE(11) + 120;
  290.   DynamicJsonDocument doc(capacity);
  291.   DeserializationError error = deserializeJson(doc, data);
  292.   if (error) {
  293.     Serial.print(F("deserializeJson() failed: "));
  294.     Serial.println(error.c_str());
  295.     return;
  296.   }
  297.   const char* city = doc["city"];
  298.   const char* updateTime = doc["updateTime"];
  299.   const char* aqi = doc["aqi"];
  300.   const char* level = doc["level"];
  301.   const char* pm25 = doc["pm25"];
  302.   const char* pm10 = doc["pm10"];
  303.   const char* SO2 = doc["SO2"];
  304.   const char* NO2 = doc["NO2"];
  305.   const char* CO = doc["CO"];
  306.   const char* O3 = doc["O3"];
  307.   city1 = city;
  308.   level1 = level;
  309.   pm251 = pm25;


  310.   BLINKER_LOG("城市:", city1);//1
  311.   BLINKER_LOG("更新时间:", updateTime);
  312.   BLINKER_LOG("aqi:", aqi);
  313.   BLINKER_LOG("污染程度:", level1); //2
  314.   BLINKER_LOG("pm25:", pm251);//3
  315.   BLINKER_LOG("pm10:", pm10);
  316.   BLINKER_LOG("SO2:", SO2);
  317.   BLINKER_LOG("NO2:", NO2);
  318.   BLINKER_LOG("CO:", CO);
  319.   BLINKER_LOG("O3:", O3);
  320. }

  321. void weatherForecastData(const String & data)//天气
  322. {
  323.   BLINKER_LOG("weather: ", data);
  324.   const size_t capacity = JSON_ARRAY_SIZE(4) + JSON_OBJECT_SIZE(4) + 4 * JSON_OBJECT_SIZE(10) + 650;
  325.   DynamicJsonDocument doc(capacity);
  326.   DeserializationError error = deserializeJson(doc, data);
  327.   if (error) {
  328.     Serial.print(F("deserializeJson() failed: "));
  329.     Serial.println(error.c_str());
  330.     return;
  331.   }

  332.   const char* city = doc["city"];
  333.   const char* province = doc["province"];
  334.   const char* updateTime = doc["updateTime"];

  335.   JsonArray forecasts = doc["forecasts"];

  336.   JsonObject forecasts_0 = forecasts[0];
  337.   const char* forecasts_0_date = forecasts_0["date"];
  338.   const char* forecasts_0_week = forecasts_0["week"];
  339.   const char* forecasts_0_dayweather = forecasts_0["dayweather"];
  340.   const char* forecasts_0_nightweather = forecasts_0["nightweather"];
  341.   const char* forecasts_0_daytemp = forecasts_0["daytemp"];
  342.   const char* forecasts_0_nighttemp = forecasts_0["nighttemp"];
  343.   const char* forecasts_0_daywind = forecasts_0["daywind"];
  344.   const char* forecasts_0_nightwind = forecasts_0["nightwind"];
  345.   const char* forecasts_0_daypower = forecasts_0["daypower"];
  346.   const char* forecasts_0_nightpower = forecasts_0["nightpower"];
  347.   forecasts_0_dayweather1 = forecasts_0_dayweather;
  348.   forecasts_0_nightweather1 = forecasts_0_nightweather;
  349.   forecasts_0_daytemp1 = forecasts_0_daytemp;
  350.   forecasts_0_nighttemp1 = forecasts_0_nighttemp;
  351.   forecasts_0_daywind1 = forecasts_0_daywind;

  352.   BLINKER_LOG("城市:", city);
  353.   BLINKER_LOG("更新时间:", updateTime);
  354.   BLINKER_LOG("时间:", forecasts_0_date);
  355.   BLINKER_LOG("星期:", forecasts_0_week);
  356.   BLINKER_LOG("白天天气现象:", forecasts_0_dayweather);//4
  357.   BLINKER_LOG("晚上天气现象:", forecasts_0_nightweather);//5
  358.   BLINKER_LOG("白天温度:", forecasts_0_daytemp);//6
  359.   BLINKER_LOG("晚上温度:", forecasts_0_nighttemp);//7
  360.   BLINKER_LOG("白天风向:", forecasts_0_daywind);//8
  361.   BLINKER_LOG("晚上风向:", forecasts_0_nightwind);
  362.   BLINKER_LOG("白天风力:", forecasts_0_daypower);
  363.   BLINKER_LOG("晚上风力:", forecasts_0_nightpower);
  364. }

  365. void jggxtq() //时间段判断更新
  366. {
  367.   int8_t hour = Blinker.hour();//时
  368.   int8_t min  = Blinker.minute();//分
  369.   BLINKER_LOG("判断是否更新天气");
  370.   if (hour == 8) {
  371.     a3 = 8;
  372.   }
  373.   if (hour == 10) {
  374.     a3 = 10;
  375.   }
  376.   if (hour == 14) {
  377.     a3 = 14;
  378.   }
  379.   if (hour == 16) {
  380.     a3 = 16;
  381.   }
  382.   if (hour == 18) {
  383.     a3 = 18;
  384.   }
  385.   if (hour == 21) {
  386.     a3 = 21;
  387.   }
  388.   if (hour == 20) {
  389.     a3 = 20;
  390.   }
  391.   if (hour == 22) {
  392.     a3 = 22;
  393.   }
  394.   if (hour == 23) {
  395.     a3 = 23;
  396.   }
  397.   if (hour == a3) {
  398.     if (min == 0) {
  399.       BLINKER_LOG("开始更新天气");
  400.       Blinker.weatherForecast();
  401.       Blinker.air();
  402.       Blinker.delay(4000);
  403.     }
  404.   }
  405. }

  406. /*********************************************************************************************************心跳发送数据到手机APP*********************************************************************************************************/

  407. void heartbeat()//心跳 发送数据到手机APP
  408. {
  409.   HUMI.print(humi_read);//湿度
  410.   TEMP.print(temp_read);//温度
  411.   TRZ.print(TRzhi);//土壤值
  412.   RSS.print(rssi);//华式温度值
  413.   LU.print(ludian_read);//露点值
  414.   CI.print(ci_read);//水泵浇水次数
  415.   TURANG.print(T);//土壤状态
  416.   BENG.print(B);//水泵状态
  417.   YUNHANG.print(rts());//显示系统运行时间
  418.   Slider1.print(zhi);//浇水阈值
  419.   CITY.print(city1);//显示城市
  420.   WURAN.print(level1);//显示污染程度
  421.   PM.print(pm251);//显示PM值
  422.   BTQX.print(forecasts_0_dayweather1);//白天天气气象
  423.   WSQX.print(forecasts_0_nightweather1); //晚上天气气象
  424.   BTWD.print(forecasts_0_daytemp1);//白天温度
  425.   WSWD.print(forecasts_0_nighttemp1);//晚上温度
  426.   BTFX.print(forecasts_0_daywind1);//白天风向
  427. }



  428. void setup()
  429. {
  430.   first_label = true;
  431.   pinMode (JDQ, OUTPUT);
  432.   pinMode(LED_BUILTIN, OUTPUT);
  433.   digitalWrite(LED_BUILTIN, LOW);
  434.   Serial.begin(115200);//打开串口波特率设置115200
  435.   BLINKER_DEBUG.debugAll();//开启调试
  436.   BLINKER_DEBUG.stream(Serial);
  437.   Blinker.begin(auth, WiFi.SSID().c_str(), WiFi.psk().c_str()); //根据配网得到的WIFI信息和设备秘钥,连接到Blinker云
  438.   blinkerConnect();//连接网络
  439.   Blinker.attachHeartbeat(heartbeat);
  440.   Blinker.attachDataStorage(dataStorage);//开启历史数据
  441.   Blinker.attachAir(airData);//注册空气质量
  442.   Blinker.attachWeatherForecast(weatherForecastData);//注册天气
  443.   Slider1.attach(slider1_callback);
  444.   Button1.attach(button1_callback);
  445.   Button2.attach(button2_callback);
  446.   dht.begin();

  447. }

  448. void loop()
  449. {
  450.   Blinker.run();
  451. //通电更新天气及空气质量
  452.   if ((first_label == true)) {
  453.     if (Blinker.init())
  454.     {
  455.       Blinker.weatherForecast();
  456.       Blinker.air();
  457.       Blinker.delay(2000);
  458.       first_label = false;
  459.     }
  460.   }
  461.   turang();
  462.   wenshidu();
  463.   Blinker.delay(2000);
  464.   gh();
  465.   printlf();
  466.   ci_read = ci;//浇水次数
  467.   jggxtq();
  468. }
复制代码

Blinker APP界面配置
  1. {¨version¨¨2.0.0¨¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨dark¨¨background¨{¨img¨¨assets/img/bg/1.jpg¨}}¨dashboard¨|{¨type¨¨num¨¨t0¨¨土壤湿度¨¨ico¨¨fal fa-question¨¨clr¨¨#00A90C¨¨min¨É¨max¨¢1c¨uni¨´%´¨bg¨Ê¨cols¨Í¨rows¨Ë¨key¨¨TRZ¨´x´É´y´É¨lstyle¨Ë}{ßBßCßD¨室内湿度¨ßFßGßH¨#6010E4¨ßJÉßKº0ßL´%´ßMÊßNÍßOËßP¨humi¨´x´Í´y´ÉßRË}{ßBßCßD¨室内温度¨ßF¨fal fa-thermometer-three-quarters¨ßH¨#EA0909¨ßJÉßKº0ßL´℃´ßMËßNËßOËßP¨temp¨´x´Ë´y´Ë}{ßBßCßD¨信号强度¨ßF¨fal fa-signal-4¨ßHßIßJÉßKº0ßL¨Dbm¨ßMËßNËßOËßP¨rssi¨´x´Ï´y´ËßRÉ}{ßBßCßD¨空气露点¨ßF¨fal fa-cloud-hail¨ßH¨#389BEE¨ßJÉßKº0ßL¨Td¨ßMËßNËßOËßP¨ludian¨´x´Í´y´ËßRÉ}{ßB¨deb¨¨mode¨ÉßMÉßNÑßOÌßP¨debug¨´x´É´y´¤E}{ßB¨ran¨ßD¨自动浇水阀值¨ßH¨#076EEF¨ßKº0ßJÉßMËßNÑßOËßPßl´x´É´y´Ñ}{ßBßCßD¨自动浇水¨ßF¨fal fa-repeat-alt¨ßHßnßJÉßK¢2bIßL´次´ßMËßNËßOËßP¨ci¨´x´É´y´ËßRÉ}{ßB¨tex¨ßD¨土壤是否潮湿¨¨t1¨´´¨size¨´´ßMËßF¨fal fa-flower-tulip¨ßNÍßOÊßP¨turang¨´x´Ë´y´¤BßRÊ}{ßBßrßD¨水泵状态¨ßt´´ßu´´ßMËßF¨fal fa-fan¨ßNÍßOÊßP¨beng¨´x´Ë´y´¤AßRÊ}{ßB¨btn¨ßF¨fal fa-lightbulb-on¨ßjÊßD¨系统指示灯¨ßt¨文本2¨ßMËßNËßOËßP¨zhaoming¨´x´É´y´¤AßRÉßH¨#FBA613¨}{ßBß10ßF¨fal fa-faucet-drip¨ßjÊßD¨手动浇水¨ßtß13ßMËßNËßOËßP¨jiaoshui¨´x´Ï´y´¤AßRÉßHßn}{ßBßrßD´´ßt¨系统运行时间¨ßu´20´ßMËßF¨fal fa-plug¨ßNÑßOËßP¨yunhang¨´x´É´y´¤CßRÏßHßI}{ßBßrßD´´ßt¨当前城市¨ßu´18´ßMËßF¨fal fa-route¨ßNËßOËßP¨city¨´x´É´y´ÍßRËßHßI}{ßBßrßD´´ßt¨PM2.5¨ßu´18´ßMËßF¨fal fa-fog¨ßNËßOËßP´pm´´x´Ë´y´ÍßHßTßRË}{ßBßrßD´´ßt¨污染程度¨ßu´18´ßMËßF¨fal fa-clouds¨ßNËßOËßP¨wuran¨´x´Í´y´ÍßRËßHßX}{ßBßrßD´´ßt¨白天风向¨ßu´18´ßMËßF¨fal fa-smoke¨ßNËßOËßP¨btfx¨´x´Ï´y´ÍßHßnßRË}{ßBßrßD´´ßt¨白天天气¨ßu´18´ßMËßF¨fal fa-sun¨ßNËßOËßP¨btqx¨´x´É´y´ÏßRËßHß15}{ßBßrßD´´ßt¨晚上天气¨ßu´18´ßMËßF¨fal fa-moon-stars¨ßNËßOËßP¨wsqx¨´x´Ë´y´ÏßRËßHßT}{ßBßrßD´´ßt¨白天温度¨ßu´20´ßMËßF¨fal fa-house-day¨ßNËßOËßP¨btwd¨´x´Í´y´ÏßRËßHßI}{ßBßrßD´´ßt¨晚上温度¨ßu´20´ßMËßF¨fal fa-house-night¨ßNËßOËßP¨wswd¨´x´Ï´y´ÏßRËßH¨#595959¨}÷¨actions¨|÷¨triggers¨|÷´rt´|÷}
复制代码



 楼主| 发表于 2022-1-17 10:37 | 显示全部楼层
本帖最后由 ht256929 于 2022-1-17 10:45 编辑
1361139229 发表于 2022-1-16 10:14
兄弟,需要哪些硬件设备之类的能否罗列一下出来,感谢

我用的是下面的设备
安信可ESP32 NodeMCU-32S CH340
土壤湿度传感器:电容式土壤湿度传感器模块  Molsture Sensor V1.2
温湿度传感器:DHT11
继电器;可以调高低电平触发的1路继电器
水泵;直流电机小潜水泵 2.5V-6V
电源供电是直接用手机充电器供电的,水泵的电源是单独的一个手机充电器供电。

天气及空气质量是用的Blinker请求返回的数据
继电器信号脚插在 esp32的 12脚
土壤湿度传感器信号脚插在esp32的 35脚
温湿度传感器信号脚插在esp32的 35脚

发表于 2022-1-16 10:14 | 显示全部楼层
兄弟,需要哪些硬件设备之类的能否罗列一下出来,感谢
发表于 2022-1-21 15:32 | 显示全部楼层
这只用了一个模拟脚,8266应该也可以吧?
 楼主| 发表于 2022-1-21 16:29 来自手机 | 显示全部楼层
longjunling 发表于 2022-1-21 15:32
这只用了一个模拟脚,8266应该也可以吧?

8266可以
发表于 2022-1-23 21:00 | 显示全部楼层
界面配置怎么搞?我复制粘贴过去没用
发表于 2022-1-23 21:01 | 显示全部楼层
界面配置怎么搞?我复制粘贴过去没用
发表于 2022-1-23 21:35 | 显示全部楼层
const size_t capacity = JSON_ARRAY_SIZE(4) + JSON_OBJECT_SIZE(4) + 4 * JSON_OBJECT_SIZE(10) + 650;

请问,这个空间的计算,可有什么依据? 我一直搞不懂
 楼主| 发表于 2022-1-24 13:16 | 显示全部楼层
1361139229 发表于 2022-1-23 21:01
界面配置怎么搞?我复制粘贴过去没用

C67BEE09-580E-4F21-A3A2-63CB298F3B8E.png
你依这个配置数据 文本的控件试试
 楼主| 发表于 2022-1-24 13:20 | 显示全部楼层
Highnose 发表于 2022-1-23 21:35
const size_t capacity = JSON_ARRAY_SIZE(4) + JSON_OBJECT_SIZE(4) + 4 * JSON_OBJECT_SIZE(10) + 650;

...

https://www.arduino.cn/forum.php ... &highlight=json
具体我没仔细研究,因为我也不懂C语言
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-28 07:30 , Processed in 0.109984 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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