0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

開源教程:基于ESP8266和機(jī)智云的智能雨林缸,成本低、高智能

機(jī)智云 ? 2022-01-18 17:55 ? 次閱讀

項(xiàng)目內(nèi)容:

1.燈光控制

2.循環(huán)控制

3.溫度采集

4.溫度和噴淋自動(dòng)控制(手動(dòng)控制下加熱和噴淋可控,自動(dòng)模式下加熱和噴淋不可控)

5.狀態(tài)斷電記憶




云端部署:

本次設(shè)計(jì)以esp8266作為主控,SOC方案,利用賽博坦工具快速生成APP。

1.創(chuàng)建產(chǎn)品, 進(jìn)入開發(fā)者中心,點(diǎn)擊右上角,創(chuàng)建新產(chǎn)品,按照如圖所示創(chuàng)建新的產(chǎn)品。

poYBAGHmg22AddwAAAIt2Gu6hro517.pngpoYBAGHmg92APc_wAABvRB92Ly8665.png


2.創(chuàng)建數(shù)據(jù)點(diǎn)。

poYBAGHmg_iADY2nAADYzG3nOl0085.pngpYYBAGHmg_iAd82NAAChPDVb_18874.png

3.生成ESP8266_32M SOC代碼,下載電腦備用。

pYYBAGHmhBOATcIMAACE-JEYuAg504.png

4.由左上角的體驗(yàn)新版本切換到新版本開發(fā)者中心,點(diǎn)擊右上角+創(chuàng)建一個(gè)新的移動(dòng)應(yīng)用。

pYYBAGHmhDeAWtIfAAEG4XtEY5w257.png

5.點(diǎn)開創(chuàng)建好的應(yīng)用,關(guān)聯(lián)設(shè)備到移動(dòng)應(yīng)用里面。其他參數(shù)根據(jù)自己需求進(jìn)行更改

pYYBAGHmhEiAZZuUAAG_-IeWuZo053.png

6.回到新版本主頁,在左側(cè)選擇自己創(chuàng)建的產(chǎn)品,然后進(jìn)行模組配置。配置成樂鑫模組,注意只需要修改模組就行,熱點(diǎn)參數(shù)無需更改。

pYYBAGHmhGyAHju8AAEuPuYehOs206.png

7.進(jìn)入應(yīng)用頁面,進(jìn)行控制頁面修改。

pYYBAGHmhH2AWE7gAAI83Nvs18M333.png

8.根據(jù)自己需求設(shè)置好控制模塊的大小以及圖標(biāo)。其余參數(shù)根據(jù)自己的需求修改。級的每個(gè)頁面都需要保存。

pYYBAGHmhI-AcL_OAALgrJId-0g646.png

9.配置好所有參數(shù)過后,回到之前創(chuàng)建的移動(dòng)應(yīng)用里面,進(jìn)行應(yīng)用的構(gòu)建,構(gòu)建成功以后掃描后面的二維碼下載安裝到手機(jī),到此云端部署完成。

pYYBAGHmhJ6ADaT8AAFDRQzak-w936.png




硬件接線:

此項(xiàng)目不公開PCB,可以自己購買4路繼電器,及防水溫度傳感器DS18B20探頭,ESP12S小系統(tǒng)板。

繼電器----GPIO13(加熱管)GPIO12(循環(huán)電機(jī))GPIO16(噴淋電機(jī))GPIO5(燈光)

配網(wǎng)按鍵----GPIO14(按下低電平)

溫度傳感器----GPIO4(傳感器需要上拉電阻

poYBAGHmhLeAHHEIAAAUK24z5nI430.png




程序修改:

1.本次采用IDE方式進(jìn)行開發(fā)編譯(開發(fā)環(huán)境鏈接:https://pan.baidu.com/s/1TTIU-74mBxo9UqxLbX7Grw 提取碼:0htq,解壓過后即可使用,路徑不能有中文),將前面下載的代碼進(jìn)行解壓,路徑不要含有中文。在IDE環(huán)境里面導(dǎo)入項(xiàng)目。導(dǎo)入步步驟易出錯(cuò),注意根據(jù)下圖中所示步驟進(jìn)行導(dǎo)入。

poYBAGHmhN-AFcZPAAGZW2v63I4153.pngpoYBAGHmhN-AE0blAAKRqndkAmQ677.pngpYYBAGHmhN-AHuMaAAFEelOGZAI919.png

2.修改編譯參數(shù),打開根目錄下面的Makefile文件,然后修改23到27行的內(nèi)容。(注意:本教程代碼不可以在網(wǎng)頁上進(jìn)行復(fù)制粘貼,由于編碼不一致可能會導(dǎo)致程序不能編譯,無法編譯需要重新解壓代碼從頭再來。代碼需要自己手打。每次輸入代碼過后需要保存以后編譯才會生效。)

  1. BOOT?=new
  2. APP?=1
  3. SPI_SPEED?=40
  4. SPI_MODE?=QIO
  5. SPI_SIZE_MAP?=6

復(fù)制代碼


poYBAGHlIKiAe696AAHW-ddw61w691.png.thumb.jpg

3.按鍵部分無需修改,因?yàn)樽詣?dòng)生成的代碼就是gpio14按鍵長按短按進(jìn)行網(wǎng)絡(luò)配置。繼電器引腳的初始化我們寫在按鍵函數(shù)的初始化里面, 初始化為輸出模式。

  1. GPIO_OUTPUT_SET(GPIO_ID_PIN(5),1);//燈光
  2. GPIO_OUTPUT_SET(GPIO_ID_PIN(13),1);//加熱管
  3. GPIO_OUTPUT_SET(GPIO_ID_PIN(12),1);//循環(huán)電機(jī)
  4. gpio16_output_conf();//噴淋電機(jī)

復(fù)制代碼

poYBAGHmhPeAN6iXAAHJtEpPR2M923.png

4.在gizwits_product.c和gizwits_product.h增加全局變量。

  1. //flash相關(guān)
  2. #define sec 137 //137扇區(qū),程序小于480K flash存儲的安全區(qū)域的起始地址137-1024扇區(qū)
  3. #define sec1 138 //138扇區(qū),程序小于480K flash存儲的安全區(qū)域的起始地址137-1024扇區(qū)
  4. bool STATE[6] = {0,0,0,0,0,0};//開機(jī)各個(gè)開關(guān)狀態(tài)標(biāo)識
  5. uint32_t Set_Temp=0; //溫度自動(dòng)控制
  6. uint32_t Open_Time=0; //噴淋開時(shí)間
  7. uint32_t Off_Time=0; //噴淋關(guān)時(shí)間
  8. extern bool STATE[6]; //開機(jī)各個(gè)開關(guān)狀態(tài)標(biāo)識
  9. extern uint32_t Set_Temp; //溫度自動(dòng)控制
  10. extern uint32_t Open_Time; //噴淋開時(shí)間
  11. extern uint32_t Off_Time; //噴淋關(guān)時(shí)間

復(fù)制代碼


poYBAGHmhTOAZTspAAIzo71p7NU533.png

\

5.在gizwits_product.c的gizwitsEventProcess函數(shù)里面對開關(guān)狀態(tài)進(jìn)行緩存。程序帶有注釋,此處不做截圖,具體參考下面的程序更改。(注意:此函數(shù)的是數(shù)據(jù)點(diǎn)下發(fā)過后,可寫類型的數(shù)據(jù)處理,會根據(jù)數(shù)據(jù)點(diǎn)的不同而不同。程序不能再網(wǎng)頁復(fù)制,會導(dǎo)致編碼不一致程序出錯(cuò))

  1. int8_t ICACHE_FLASH_ATTR gizwitsEventProcess(eventInfo_t *info, uint8_t *data, uint32_t len)
  2. {
  3. uint8_t i = 0;
  4. dataPoint_t * dataPointPtr = (dataPoint_t *)data;
  5. moduleStatusInfo_t * wifiData = (moduleStatusInfo_t *)data;
  6. if((NULL == info) || (NULL == data))
  7. {
  8. GIZWITS_LOG("!!! gizwitsEventProcess Error \n");
  9. return -1;
  10. }
  11. for(i = 0; i < info->num; i++)
  12. {
  13. switch(info->event)
  14. {
  15. case EVENT_Water_Cycle :
  16. currentDataPoint.valueWater_Cycle = dataPointPtr->valueWater_Cycle;
  17. GIZWITS_LOG("Evt: EVENT_Water_Cycle %d \n", currentDataPoint.valueWater_Cycle);
  18. if(0x01 == currentDataPoint.valueWater_Cycle)
  19. {
  20. STATE[0]=1; //水循環(huán)打開
  21. }
  22. else
  23. {
  24. STATE[0]=0; //水循環(huán)關(guān)閉
  25. }
  26. STATE[6]=1;//flash存儲狀態(tài)
  27. break;
  28. case EVENT_Spray :
  29. currentDataPoint.valueSpray = dataPointPtr->valueSpray;
  30. GIZWITS_LOG("Evt: EVENT_Spray %d \n", currentDataPoint.valueSpray);
  31. if(0x01 == currentDataPoint.valueSpray)
  32. {
  33. if(STATE[4]==0)
  34. {
  35. STATE[2]=1; //如果為手動(dòng)模式,噴淋開關(guān)打開,否則不動(dòng)作
  36. STATE[6]=1;//flash存儲狀態(tài)
  37. }
  38. }
  39. else
  40. {
  41. if(STATE[4]==0)
  42. {
  43. STATE[2]=0; //如果為手動(dòng)模式,噴淋開關(guān)關(guān)閉,否則不動(dòng)作
  44. STATE[6]=1;//flash存儲狀態(tài)
  45. }
  46. }
  47. currentDataPoint.valueSpray = STATE[2];//更新數(shù)據(jù)點(diǎn),APP更新
  48. break;
  49. case EVENT_Lamp :
  50. currentDataPoint.valueLamp = dataPointPtr->valueLamp;
  51. GIZWITS_LOG("Evt: EVENT_Lamp %d \n", currentDataPoint.valueLamp);
  52. if(0x01 == currentDataPoint.valueLamp)
  53. {
  54. STATE[1]=1; //燈光打開
  55. }
  56. else
  57. {
  58. STATE[1]=0; //燈光關(guān)閉
  59. }
  60. STATE[6]=1;//flash存儲狀態(tài)
  61. break;
  62. case EVENT_Heating :
  63. currentDataPoint.valueHeating = dataPointPtr->valueHeating;
  64. GIZWITS_LOG("Evt: EVENT_Heating %d \n", currentDataPoint.valueHeating);
  65. if(0x01 == currentDataPoint.valueHeating)
  66. {
  67. if(STATE[4]==0)
  68. {
  69. STATE[3]=1; //如果為手動(dòng)模式,加熱開關(guān)打開,否則不動(dòng)作
  70. STATE[6]=1;//flash存儲狀態(tài)
  71. }
  72. }
  73. else
  74. {
  75. if(STATE[4]==0)
  76. {
  77. STATE[3]=0; //如果為手動(dòng)模式,加熱開關(guān)關(guān)閉,否則不動(dòng)作
  78. STATE[6]=1;//flash存儲狀態(tài)
  79. }
  80. }
  81. currentDataPoint.valueHeating = STATE[3];//更新數(shù)據(jù)點(diǎn),APP更新
  82. break;
  83. case EVENT_mode:
  84. currentDataPoint.valuemode = dataPointPtr->valuemode;
  85. GIZWITS_LOG("Evt: EVENT_mode %d\n", currentDataPoint.valuemode);
  86. switch(currentDataPoint.valuemode)
  87. {
  88. case mode_VALUE0:
  89. STATE[4]=0; //手動(dòng)模式
  90. break;
  91. case mode_VALUE1:
  92. STATE[4]=1; //自動(dòng)模式
  93. break;
  94. default:
  95. break;
  96. }
  97. STATE[6]=1;//flash存儲狀態(tài)
  98. break;
  99. case EVENT_Set_Temperature:
  100. currentDataPoint.valueSet_Temperature= dataPointPtr->valueSet_Temperature;
  101. GIZWITS_LOG("Evt:EVENT_Set_Temperature %d\n",currentDataPoint.valueSet_Temperature);
  102. Set_Temp = currentDataPoint.valueSet_Temperature; //緩存設(shè)置溫度
  103. STATE[6]=1;//flash存儲狀態(tài)
  104. break;
  105. case EVENT_Spray_Open_Time:
  106. currentDataPoint.valueSpray_Open_Time= dataPointPtr->valueSpray_Open_Time;
  107. GIZWITS_LOG("Evt:EVENT_Spray_Open_Time %d\n",currentDataPoint.valueSpray_Open_Time);
  108. Open_Time = currentDataPoint.valueSpray_Open_Time;//緩存設(shè)置開時(shí)間
  109. STATE[6]=1;//flash存儲狀態(tài)
  110. break;
  111. case EVENT_Spray_Off_Time:
  112. currentDataPoint.valueSpray_Off_Time= dataPointPtr->valueSpray_Off_Time;
  113. GIZWITS_LOG("Evt:EVENT_Spray_Off_Time %d\n",currentDataPoint.valueSpray_Off_Time);
  114. Off_Time = currentDataPoint.valueSpray_Off_Time;//緩存設(shè)置關(guān)時(shí)間
  115. STATE[6]=1;//flash存儲狀態(tài)
  116. break;

復(fù)制代碼


6. 接下來我們處理斷電開機(jī)之后開關(guān)以及各項(xiàng)參數(shù)的初始化。主要是利用flash讀取獲取參數(shù)。數(shù)據(jù)狀態(tài)存放在flash,后續(xù)教程及程序會有存儲體現(xiàn)。初始化主要修改userInit函數(shù)。

  1. void ICACHE_FLASH_ATTR userInit(void)
  2. {
  3. gizMemset((uint8_t *)¤tDataPoint, 0, sizeof(dataPoint_t));
  4. //flash相關(guān)
  5. uint32 value;
  6. //定義數(shù)組addr_case1
  7. uint8* addr_case1 = (uint8*)&value;//四字節(jié)對齊
  8. uint8* addr_case2 = (uint8*)&value;//四字節(jié)對齊
  9. //讀取flash數(shù)據(jù),sec*4*1024就是讀取起始地址,就是具體的字節(jié)地址
  10. spi_flash_read(sec*4*1024, (uint32*)addr_case1, sizeof(addr_case1));
  11. spi_flash_read(sec1*4*1024, (uint32*)addr_case2, sizeof(addr_case2));
  12. if(addr_case1[0]==1) STATE[0]=1; //水循環(huán)
  13. else STATE[0]=0;
  14. if(addr_case1[1]==1) STATE[1]=1; //燈光
  15. else STATE[1]=0;
  16. if(addr_case1[2]==1) STATE[2]=1; //噴淋
  17. else STATE[2]=0;
  18. if(addr_case1[3]==1) STATE[3]=1; //加熱
  19. else STATE[3]=0;
  20. if(addr_case2[0]==1) STATE[4]=1; //模式
  21. else STATE[4]=0;
  22. currentDataPoint.valueSet_Temperature = (uint32_t)addr_case2[1];
  23. currentDataPoint.valueSpray_Open_Time = (uint32_t)addr_case2[2];
  24. currentDataPoint.valueSpray_Off_Time = (uint32_t)addr_case2[3];
  25. currentDataPoint.valueWater_Cycle = STATE[0];
  26. currentDataPoint.valueSpray = STATE[2];
  27. currentDataPoint.valueLamp = STATE[1];
  28. currentDataPoint.valueHeating = STATE[3];
  29. currentDataPoint.valuemode = STATE[4];
  30. currentDataPoint.valueTemperature = 0;
  31. Set_Temp = currentDataPoint.valueSet_Temperature;
  32. Open_Time = currentDataPoint.valueSpray_Open_Time;
  33. Off_Time = currentDataPoint.valueSpray_Off_Time;
  34. GPIO_OUTPUT_SET(GPIO_ID_PIN(12),!STATE[0]);//水循環(huán)
  35. GPIO_OUTPUT_SET(GPIO_ID_PIN(5),!STATE[1]);//燈光
  36. }

復(fù)制代碼


7.在gizwits_product.c新增DS18B20驅(qū)動(dòng)函數(shù)。由于程序太長此處不再截圖。

  1. /************************
  2. * 函 數(shù) 名 : Ds18b20Init
  3. * 函數(shù)功能 : 初始化
  4. * 輸 入 : 無
  5. * 輸 出 : 初始化成功返回1,失敗返回0
  6. ************************/
  7. uint8 Ds18b20Init() {
  8. int i;
  9. PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
  10. GPIO_OUTPUT_SET(GPIO_ID_PIN(4), 0); //將總線拉低480us~960us
  11. os_delay_us(642); //延時(shí)642us
  12. GPIO_OUTPUT_SET(GPIO_ID_PIN(4), 1); //然后拉高總線,如果DS18B20做出反應(yīng)會將在15us~60us后總線拉低
  13. while (GPIO_INPUT_GET(GPIO_ID_PIN(4))) //等待DS18B20拉低總線
  14. {
  15. os_delay_us(500);
  16. os_delay_us(500);
  17. i++;
  18. if (i > 5) //等待>5MS
  19. {
  20. return 0;//初始化失敗
  21. }
  22. }
  23. return 1;//初始化成功
  24. }
  25. /************************
  26. * 函 數(shù) 名 : Ds18b20WriteByte
  27. * 函數(shù)功能 : 向18B20寫入一個(gè)字節(jié)
  28. * 輸 入 : dat
  29. * 輸 出 : 無
  30. ************************/
  31. void Ds18b20WriteByte(uint8 dat) {
  32. int i, j;
  33. for (j = 0; j < 8; j++) {
  34. GPIO_OUTPUT_SET(GPIO_ID_PIN(4), 0); //每寫入一位數(shù)據(jù)之前先把總線拉低1us
  35. i++;
  36. GPIO_OUTPUT_SET(GPIO_ID_PIN(4), dat & 0x01); //然后寫入一個(gè)數(shù)據(jù),從最低位開始
  37. os_delay_us(70); //延時(shí)68us,持續(xù)時(shí)間最少60us
  38. GPIO_OUTPUT_SET(GPIO_ID_PIN(4), 1); //然后釋放總線,至少1us給總線恢復(fù)時(shí)間才能接著寫入第二個(gè)數(shù)值
  39. dat >>= 1;
  40. }
  41. }
  42. /************************
  43. * 函 數(shù) 名 : Ds18b20ReadByte
  44. * 函數(shù)功能 : 讀取一個(gè)字節(jié)
  45. * 輸 入 : 無
  46. * 輸 出 : byte
  47. ************************/
  48. uint8 Ds18b20ReadByte() {
  49. uint8 byte, bi;
  50. int i, j;
  51. for (j = 8; j > 0; j--) {
  52. GPIO_OUTPUT_SET(GPIO_ID_PIN(4), 0); //先將總線拉低1us
  53. i++;
  54. GPIO_OUTPUT_SET(GPIO_ID_PIN(4), 1); //然后釋放總線
  55. i++;
  56. i++; //延時(shí)6us等待數(shù)據(jù)穩(wěn)定
  57. bi = GPIO_INPUT_GET(GPIO_ID_PIN(4)); //讀取數(shù)據(jù),從最低位開始讀取
  58. /*將byte左移一位,然后與上右移7位后的bi,注意移動(dòng)之后移掉那位補(bǔ)0。*/
  59. byte = (byte >> 1) | (bi << 7);
  60. os_delay_us(48); //讀取完之后等待48us再接著讀取下一個(gè)數(shù)
  61. }
  62. return byte;
  63. }
  64. /************************
  65. * 函 數(shù) 名 : Ds18b20ChangTemp
  66. * 函數(shù)功能 : 讓18b20開始轉(zhuǎn)換溫度
  67. * 輸 入 : 無
  68. * 輸 出 : 無
  69. ************************/
  70. void Ds18b20ChangTemp() {
  71. Ds18b20Init();
  72. os_delay_us(500);
  73. os_delay_us(500);
  74. Ds18b20WriteByte(0xcc); //跳過ROM操作命令
  75. Ds18b20WriteByte(0x44); //溫度轉(zhuǎn)換命令
  76. // 延時(shí)100ms 等待轉(zhuǎn)換成功,而如果你是一直刷著的話,就不用這個(gè)延時(shí)了
  77. }
  78. /************************
  79. * 函 數(shù) 名 : Ds18b20ReadTempCom
  80. * 函數(shù)功能 : 發(fā)送讀取溫度命令
  81. * 輸 入 : 無
  82. * 輸 出 : 無
  83. ************************/
  84. void Ds18b20ReadTempCom() {
  85. Ds18b20Init();
  86. os_delay_us(500);
  87. os_delay_us(500);
  88. Ds18b20WriteByte(0xcc); //跳過ROM操作命令
  89. Ds18b20WriteByte(0xbe); //發(fā)送讀取溫度命令
  90. }
  91. /************************
  92. * 函 數(shù) 名 : Ds18b20ReadTemp
  93. * 函數(shù)功能 : 讀取溫度
  94. * 輸 入 : 無
  95. * 輸 出 : temp
  96. ************************/
  97. float Ds18b20ReadTemp() {
  98. float temp = 0;
  99. uint8 tmh, tml;
  100. uint32_t temp1;
  101. Ds18b20ChangTemp(); //先寫入轉(zhuǎn)換命令
  102. Ds18b20ReadTempCom(); //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
  103. tml = Ds18b20ReadByte(); //讀取溫度值共16位,先讀低字節(jié)
  104. tmh = Ds18b20ReadByte(); //再讀高字節(jié)
  105. temp1 = tmh;
  106. temp1 <<= 8;
  107. temp1 |= tml;
  108. temp = temp1*0.0625;
  109. temp = ((temp+0.005)*100)/100;//保留2位小數(shù),四舍五入
  110. return temp;
  111. }

復(fù)制代碼


在gizwits_product.c新增溫度傳感器的函數(shù)**。

  1. uint8 Ds18b20Init();
  2. void Ds18b20WriteByte(uint8 dat);
  3. uint8 Ds18b20ReadByte();
  4. void Ds18b20ChangTemp();
  5. void Ds18b20ReadTempCom();
  6. float Ds18b20ReadTemp();

復(fù)制代碼


pYYBAGHlIKmAehdtAAJfKSiZrWE732.png.thumb.jpg

8.在gizwits_product.c的userHandle函數(shù)里面對GPIO輸出點(diǎn),溫度采集,flash存儲以及邏輯控制進(jìn)行編寫。此處不在截圖。

  1. void ICACHE_FLASH_ATTR userHandle(void)
  2. {
  3. //flash相關(guān)
  4. uint32 value;
  5. //定義數(shù)組addr_case1
  6. uint8* addr_case1 = (uint8*)&value;
  7. uint8* addr_case2 = (uint8*)&value;
  8. LOCAL float tempvalue;//采集溫度
  9. LOCAL uint32_t opentime=0;//開計(jì)時(shí)
  10. LOCAL uint32_t offtime=0;//關(guān)計(jì)時(shí)
  11. LOCAL bool onoff=0;//開關(guān)狀態(tài),0關(guān),1開
  12. os_delay_us(642);
  13. LOCAL uint8_t temp_time=0;//溫度采集間隔時(shí)間
  14. if(temp_time<=1)temp_time++;
  15. else
  16. {
  17. temp_time=0;
  18. tempvalue = Ds18b20ReadTemp();
  19. currentDataPoint.valueTemperature = tempvalue;
  20. }
  21. if(STATE[4])//自動(dòng)模式下噴淋和加熱控制
  22. {
  23. //加熱溫度控制
  24. if(tempvalue<(float)Set_Temp) STATE[3]=1;
  25. else STATE[3]=0;
  26. //噴淋控制
  27. if(onoff)//開狀態(tài)
  28. {
  29. if(opentime>0) opentime--;
  30. else
  31. {
  32. onoff=0;//切換關(guān)狀態(tài)
  33. offtime=Off_Time*60;//賦值關(guān)閉時(shí)間
  34. STATE[2]=0;
  35. }
  36. }
  37. else if(onoff==0)//關(guān)狀態(tài)
  38. {
  39. if(offtime>0) offtime--;
  40. else
  41. {
  42. onoff=1;//切換開狀態(tài)
  43. opentime=Open_Time*60;//賦值打開時(shí)間
  44. STATE[2]=1;
  45. }
  46. }
  47. gpio16_output_set(!STATE[2]);//噴淋
  48. GPIO_OUTPUT_SET(GPIO_ID_PIN(13),!STATE[3]);//加熱
  49. currentDataPoint.valueSpray = STATE[2];
  50. currentDataPoint.valueHeating = STATE[3];
  51. }
  52. else //手動(dòng)模式
  53. {
  54. GPIO_OUTPUT_SET(GPIO_ID_PIN(13),!STATE[3]);//加熱
  55. gpio16_output_set(!STATE[2]);//噴淋
  56. }
  57. if(STATE[6]==1) //狀態(tài)改變
  58. {
  59. STATE[6]=0;//清除狀態(tài)
  60. GPIO_OUTPUT_SET(GPIO_ID_PIN(12),!STATE[0]);//水循環(huán)
  61. GPIO_OUTPUT_SET(GPIO_ID_PIN(5),!STATE[1]);//燈光
  62. //flash存儲數(shù)據(jù)前轉(zhuǎn)換數(shù)據(jù)
  63. addr_case1[0] = (uint8)STATE[0];
  64. addr_case1[1] = (uint8)STATE[1];
  65. addr_case1[2] = (uint8)STATE[2];
  66. addr_case1[3] = (uint8)STATE[3];
  67. addr_case2[0] = (uint8)STATE[4];
  68. addr_case2[1] = (uint8)currentDataPoint.valueSet_Temperature;
  69. addr_case2[2] = (uint8)currentDataPoint.valueSpray_Open_Time ;
  70. addr_case2[3] = (uint8)currentDataPoint.valueSpray_Off_Time;
  71. //擦除要寫入的Flash扇區(qū)
  72. spi_flash_erase_sector(sec);
  73. //寫入數(shù)據(jù),sec*4*1024就是寫入起始地址,就是具體的字節(jié)地址
  74. spi_flash_write(sec*4*1024, (uint32*)addr_case1, sizeof(addr_case1));
  75. //擦除要寫入的Flash扇區(qū)
  76. spi_flash_erase_sector(sec1);
  77. //寫入數(shù)據(jù),sec*4*1024就是寫入起始地址,就是具體的字節(jié)地址
  78. spi_flash_write(sec1*4*1024, (uint32*)addr_case2, sizeof(addr_case2));
  79. }
  80. system_os_post(USER_TASK_PRIO_2, SIG_UPGRADE_DATA, 0);
  81. }

復(fù)制代碼


9.修改完代碼之后ctrl+B進(jìn)行編譯固件編譯。

pYYBAGHmhhGAAChsAAJNDHgZeH0563.png

10.利用樂鑫燒錄軟件將生成的固件燒錄到ESP8266里面。參數(shù)參考下圖,注意參數(shù)不能有錯(cuò)。下載硬件接線如下表下載模式。記住通電瞬間就要保持這個(gè)狀態(tài)才是下載模式。

poYBAGHmhiiAf0MUAABp0iR5ryo906.pngpYYBAGHmhiiAWnq3AAFDL3Bf62E354.pngpYYBAGHmhiiAV8ftAAFUrLnqBmo525.png

11.程序燒錄完成之后通過按鍵長按觸發(fā)airlink配網(wǎng)(或短按觸發(fā)softap配網(wǎng)),在APP選擇對應(yīng)的配網(wǎng)進(jìn)行網(wǎng)絡(luò)配置及綁定設(shè)備。綁定后進(jìn)入設(shè)備即可進(jìn)行采集和控制

pYYBAGHmhkKAZQ2NAAOgZ35Uhzc468.pngpoYBAGHmhkOAW3dOAAgX2to6Gh0943.png

12.實(shí)物展示展示

poYBAGHmhlKAYJKPACS-WlYa--M371.png


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
收藏 人收藏

    評論

    相關(guān)推薦

    機(jī)智入門必備》手把手教你燒錄GAgent固件

    本文《機(jī)智入門必備》將詳細(xì)講解GAgent固件的燒錄過程,從基礎(chǔ)設(shè)置到實(shí)際操作,將一步步帶你完成每一個(gè)環(huán)節(jié),確保你的設(shè)備順利連接機(jī)智平臺,實(shí)現(xiàn)
    的頭像 發(fā)表于 09-12 08:04 ?251次閱讀
    《<b class='flag-5'>機(jī)智</b><b class='flag-5'>云</b>入門必備》手把手教你燒錄GAgent固件

    STM32 ESP8266阿里鏈接源碼

    stm32F103C8T6 ESP8266 物聯(lián)網(wǎng)電表 登錄阿里
    發(fā)表于 08-29 14:21 ?4次下載

    esp32和esp8266代碼共用嗎

    本文將介紹ESP32和ESP8266兩款流行的微控制器在代碼共用性方面的可能性與差異性。 一、引言 隨著物聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,越來越多的智能設(shè)備開始進(jìn)入我們的生活。其中,ESP32和
    的頭像 發(fā)表于 08-19 18:23 ?809次閱讀

    esp8266esp32區(qū)別是什么

    以下是關(guān)于ESP8266ESP32的主要區(qū)別: 處理器和架構(gòu) : ESP8266 :使用一個(gè)Tensilica L106 80MHz的處理器,屬于Xtensa架構(gòu)。 ESP32 :使
    的頭像 發(fā)表于 08-19 18:16 ?3039次閱讀

    esp8266不燒錄可以使用嗎

    Systems推出的低成本、低功耗的Wi-Fi模塊。它基于Tensilica L106微處理器,具有32位處理能力,最高頻率可達(dá)160MHz。ESP8266具有豐富的外設(shè)接口,如GPIO、ADC、PWM等
    的頭像 發(fā)表于 08-19 17:28 ?497次閱讀

    機(jī)智ESP8266開發(fā)板RGB彩燈控件

    隨著智能家居技術(shù)的迅猛發(fā)展,RGB彩燈控件正逐漸成為現(xiàn)代家庭不可或缺的一部分。在這一潮流中,機(jī)智(Gizwits)的ESP8266開發(fā)板RGB彩燈控件以其先進(jìn)的物聯(lián)網(wǎng)技術(shù)和多樣化的燈
    的頭像 發(fā)表于 08-09 08:10 ?295次閱讀
    <b class='flag-5'>機(jī)智</b><b class='flag-5'>云</b><b class='flag-5'>ESP8266</b>開發(fā)板RGB彩燈控件

    STM32F103 + ESP8266機(jī)智開發(fā)常見問題集錦:入門者必讀!

    關(guān)于ESP8266模塊的選擇針對初學(xué)者,強(qiáng)烈建議選擇帶有串口的ESP8266開發(fā)板!這可以避免像我曾經(jīng)遇到的燒錄固件失敗等問題。推薦直接購買已預(yù)裝機(jī)智固件的模塊,或者帶有串口下載功能
    的頭像 發(fā)表于 07-18 08:11 ?353次閱讀
    STM32F103 + <b class='flag-5'>ESP8266</b>與<b class='flag-5'>機(jī)智</b><b class='flag-5'>云</b>開發(fā)常見問題集錦:入門者必讀!

    國產(chǎn)低成本Wi-Fi SoC解決方案芯片ESP8266ESP8285對比差異

    ESP8266ESP8285對比差異 ESP8285相當(dāng)于在ESP8266基礎(chǔ)上多加了1/2MB Flash, ESP8285與
    的頭像 發(fā)表于 05-17 11:44 ?1057次閱讀
    國產(chǎn)低<b class='flag-5'>成本</b>Wi-Fi SoC解決方案芯片<b class='flag-5'>ESP8266</b>與<b class='flag-5'>ESP</b>8285對比差異

    STM32、ESP8266與MQTT連接阿里物聯(lián)網(wǎng)的串口通信異常解析

    STM32、ESP8266與MQTT協(xié)議連接阿里物聯(lián)網(wǎng)平臺時(shí)常見的串口通信異常介紹 在構(gòu)建物聯(lián)網(wǎng)應(yīng)用時(shí),STM32、ESP8266與MQTT協(xié)議的結(jié)合是實(shí)現(xiàn)設(shè)備與網(wǎng)絡(luò)間穩(wěn)定通信的關(guān)鍵。然而,在連接
    的頭像 發(fā)表于 04-19 17:19 ?1267次閱讀

    ESP8266智能插座目前免費(fèi)穩(wěn)定的服務(wù)有哪些?

    ESP8266智能插座目前免費(fèi)穩(wěn)定的服務(wù)有哪些
    發(fā)表于 11-10 08:08

    ESP8266-01燒寫機(jī)智GAgent使用哪種SPI模式?

    ESP8266-01燒寫機(jī)智GAgent使用哪種SPI模式 官網(wǎng)有DIO和QIO兩種
    發(fā)表于 11-10 08:06

    ESP8266-01燒錄機(jī)智GAgent時(shí)SPI Mode選擇哪種?

    ESP8266-01燒錄機(jī)智GAgent時(shí)SPI Mode選擇哪種?是選擇合并的固件還是單獨(dú)燒寫
    發(fā)表于 11-10 07:54

    Esp8266接入什么平臺支持阿里智能方糖控制?

    Esp8266接入什么平臺支持阿里智能方糖控制
    發(fā)表于 11-09 06:41

    全自動(dòng)養(yǎng)護(hù)Biopod智能生態(tài)雨林

    借助機(jī)智物聯(lián)網(wǎng)平臺,我們在智能雨林中實(shí)現(xiàn)了一系列關(guān)鍵功能,以確保植物獲得最佳生長條件。這包括對光照、溫度、濕度和水分的全面管理,同時(shí)還提
    的頭像 發(fā)表于 11-08 08:11 ?543次閱讀
    全自動(dòng)養(yǎng)護(hù)Biopod<b class='flag-5'>智能</b>生態(tài)<b class='flag-5'>雨林</b><b class='flag-5'>缸</b>

    基于ESP8266機(jī)智平臺控制系統(tǒng)設(shè)計(jì)

    項(xiàng)目摘要:本項(xiàng)目以智能家居為主題,基于ESP8266機(jī)智平臺控制系統(tǒng),利用機(jī)智平臺和
    的頭像 發(fā)表于 11-07 08:10 ?1334次閱讀
    基于<b class='flag-5'>ESP8266</b>的<b class='flag-5'>機(jī)智</b><b class='flag-5'>云</b>平臺控制系統(tǒng)設(shè)計(jì)