久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2601|回復: 5
收起左側

stm32單片機智能窗簾系統設計 再次燒入時就不行了 附程序原理圖PCB

[復制鏈接]
ID:1024398 發表于 2022-5-8 08:21 | 顯示全部樓層 |閱讀模式
500黑幣
在某一個寶入的,但是再燒入時就不行了。
是基于STM32單片機的智能窗簾,程序是有問題奮斗了一晚上,實在不行了,有沒有大佬有里面的驅動程序

Snipaste_2022-05-08_08-22-04.png

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png 51hei.png

STM32單片機源程序如下:
  1. #include "my_include.h"
  2. //**All notes can be deleted and modified**//
  3. #define MAX_SET_SIZE 7
  4. u16 setParaTab[MAX_SET_SIZE]={0,50,32,65,20,8*100,9*100};//要設置的閾值 順序為 0空白非設置狀態 1光照 2溫度 3濕度 4雨滴
  5. u8 setParaCount =0;//當前要設置的變量在數組中位置

  6. u8 setMode =0;//設置模式
  7. u8 updataDis =1;//需要更新顯示標志

  8. u16 timeStart1 = 8*100;//設置 開始時間為08:00
  9. u16 timeStop1 = 9*100;//設置 結束時間為09:00

  10. char dis0[50];//液晶顯示暫存數組
  11. char dis1[128];//液晶顯示暫存數組

  12. #define F_SIZE      16
  13. #define MyLCD_Show(m,n,p)     LCD_ShowString(LCD_GetPos_X(F_SIZE,m),LCD_GetPos_Y(24,n),p,F_SIZE,false)
  14. #define ALLPARA_START_Y 3 //數據顯示行的起始值

  15. int nowYedi = 0;//液滴檢測
  16. int nowLigh = 0;//ad采集結果 光照值

  17. u8 disFlag = 0;//更新顯示

  18. u8 rememberTiemSe=0xff;//記錄當前秒數據 數據沒有變化不更新顯示 因為lcd更新顯示很浪費時間
  19. u8 devOpenFLag =0;//用于記錄設備是否需要打開狀態
  20. u16 time_now = 0;//計算當前的時間,用于比較

  21. void OnGetEspMessage(const _esp_msg_obj *espMsgRec)
  22. {
  23.     char *strPtr;
  24.     if((strPtr=strstr(espMsgRec->payload,"RTC"))!=NULL)//接收到rtc字符串 *RTC20200420173611#
  25.     {
  26.         My_RTC_SetStr(strPtr+3);//設置時間
  27.     }
  28.     if((strPtr=strstr(espMsgRec->payload,"LG"))!=NULL)//接收到LG字符串 *50#
  29.     {
  30.         setParaTab[1]=ParseInteger(strPtr+2,2);//提取光照
  31.     }
  32.     if((strPtr=strstr(espMsgRec->payload,"WD"))!=NULL)//接收到rtc字符串
  33.     {
  34.         setParaTab[2]=ParseInteger(strPtr+2,2);//提取光照
  35.     }
  36.     if((strPtr=strstr(espMsgRec->payload,"SD"))!=NULL)//接收到rtc字符串
  37.     {
  38.         setParaTab[3]=ParseInteger(strPtr+2,2);//提取光照
  39.     }
  40.     if((strPtr=strstr(espMsgRec->payload,"YD"))!=NULL)//接收到rtc字符串
  41.     {
  42.         setParaTab[4]=ParseInteger(strPtr+2,2);//提取光照
  43.     }
  44.     if((strPtr=strstr(espMsgRec->payload,"TIME"))!=NULL)//接收到字符串*TIME0800-0900#
  45.     {
  46.         timeStart1 = ParseInteger(strPtr+4,4);//計算閾值
  47.         timeStop1 = ParseInteger(strPtr+9,4);//計算閾值
  48.     }
  49.     if((strPtr=strstr(espMsgRec->payload,"MD"))!=NULL)//接收到字符串
  50.     {
  51.         if(*(strPtr+2)=='2')setMode = 2;//定時模式
  52.         else if(*(strPtr+2)=='1')setMode = 1;//手動模式
  53.         else if(*(strPtr+2)=='0')setMode = 0;//自動模式
  54.     }
  55.     if(setMode == 1)//手動模式下才進行控制
  56.     {
  57.         if((strPtr=strstr(espMsgRec->payload,"LD"))!=NULL)//接收到字符串
  58.         {
  59.             if(*(strPtr+2)=='1')led_gl = LED_ON;//打開
  60.             else if(*(strPtr+2)=='0')led_gl = LED_OFF;//關閉
  61.         }
  62.         if((strPtr=strstr(espMsgRec->payload,"DV"))!=NULL)//接收到字符串
  63.         {
  64.             if(*(strPtr+2)=='1')devOpenFLag = 1;//打開
  65.             else if(*(strPtr+2)=='0')devOpenFLag = 0;//關閉
  66.         }
  67.     }
  68.     updataDis=1;//需要更新顯示參數
  69. }

  70. void initLcdDisplay(void);//初始化液晶顯示
  71. void scanKeyAnddealKey(void);
  72. void displayOfCollectedData(void);

  73. void write_FlashBuf(void);
  74. void read_FlashBuf(void);
  75. void init_FlashBuf(void);
  76. void keySetTime( void );

  77. int main(void)
  78. {
  79.     USARTx_Init(USART1,9600); //初始化串口 及波特率
  80.     USARTx_Init(USART2,2400);
  81.     My_RTC_Init(false); //初始化 rtc
  82.     My_ADC_Init(ADC1);
  83.     My_KEY_Init();
  84.     My_LED_Init(); //輸出初始化
  85.    
  86.     init_FlashBuf();//初始化flash中數據
  87.    
  88.     led_gl=0;//上電硬件動作下
  89.     delay_ms(200);
  90. led_gl=1;

  91.     LCD_Init();   //tft初始化
  92.     DHT11_Init();//初始化dht11
  93.     LCD_Clear(Color16_BLACK);//清全屏
  94.     BACK_COLOR=Color16_BLACK;FRONT_COLOR=Color16_LIGHTBLUE;
  95.     keySetTime();//進入按鍵設置時鐘 如果是有無線通信的情況下 該按鍵設置可以取消
  96.     MyLCD_Show(1,1,"WiFi init.. ");//顯示
  97.     MyLCD_Show(1,2,"Please Waitting.. ");//顯示
  98.     Esp8266_Init_StationAP("AUAISOUT000","");
  99.     initLcdDisplay(); //上電初始化顯示內容
  100.     My_StepMotor_Init();//步進電機驅動 初始化
  101.             
  102.     while(1)
  103.     {
  104.         scanKeyAnddealKey(); //按鍵掃描及處理
  105.         if(disFlag == 1)//更新顯示
  106.         {
  107.             disFlag =0;
  108.             FRONT_COLOR=Color16_LIGHTBLUE;
  109.             if(rememberTiemSe!=calendar.second) //時間發生了變化 更新顯示
  110.             {
  111.                 rememberTiemSe = calendar.second;//記錄此刻時間
  112.                 sprintf((char*)dis0,"%04d-%02d-%02d %02d:%02d:%02d %d ",calendar.year,calendar.month,calendar.day,calendar.hour,calendar.minute,calendar.second,calendar.week);//年月日周
  113.                 MyLCD_Show(4,1,dis0);//顯示
  114.             }
  115.    
  116.             nowYedi = 99 -  My_ADC_GetPercent(ADC1,ADC_Channel_1,1,50,1850)*0.99;//m通道采集n次 然后將采集結果按照50-1800轉化為0-100顯示 也就是顯示比例
  117.             if(nowYedi > 100) nowYedi= 99;//防止出現超過100%數據
  118.             
  119.             nowLigh = My_ADC_GetLight(ADC1,ADC_Channel_2,1); //讀取ad值 轉化為0-1000
  120.             DHT11_ReadData(0);
  121.             
  122.             displayOfCollectedData();//顯示采集到的數據 并進行數據對比

  123.             if(setMode == 0)//自動模式 異常數據 報警
  124.             {
  125.                 if(nowLigh<setParaTab[1]){led_gl = LED_ON;} //光線過低 打開
  126.                 else {led_gl = LED_OFF;}
  127.                 if(nowLigh<setParaTab[1]||(DHT11_GetHumi(0)>setParaTab[3])||(nowYedi>setParaTab[4]))
  128.                     {devOpenFLag = 0;} //關閉設備
  129.                 else {devOpenFLag = 1;}
  130.             }
  131.             else if(setMode == 2)//定時模式
  132.             {
  133.                 time_now = calendar.hour*100 + calendar.minute;//計算當前時間
  134.                 if(time_now>=timeStart1 && time_now<=timeStop1)//如果當前在定時時間范圍內
  135.                 {devOpenFLag = 1;}//打開設備
  136.                 else
  137.                 {devOpenFLag = 0;} //關閉設備
  138.             }
  139.             
  140.             if(devOpenFLag==1) //無論哪一種模式下 需要控制步進電器旋轉到一周
  141.             {My_StepMotor_RotateToAngle(0,360);} //轉動一周
  142.             else
  143.             {My_StepMotor_RotateToAngle(0,0);}//轉動回原位置

  144.                     
  145.             sprintf((char*)dis1,"*D%04d%02d%02d%02d%02d%02d",calendar.year,calendar.month,calendar.day,calendar.hour,calendar.minute,calendar.second);//年月日周
  146.             sprintf(dis1,"G%03dT%03dH%03dY%03d",nowLigh,DHT11_GetTemp(0),DHT11_GetHumi(0),nowYedi);
  147.             sprintf((char*)dis1,"P%04d%04d",timeStart1,timeStop1);
  148.             sprintf(dis1,"g%03dt%03dh%03dy%03d",setParaTab[1],setParaTab[2],setParaTab[3],setParaTab[4]);
  149.             sprintf(dis1,"%s%sM%d#",(devOpenFLag == 1)?"R1":"R0",(led_gl == 0)?"L1":"L0",(int)setMode);
  150.             
  151.             My_ESP8266_SendStrToAll(dis1);//發送數據
  152.         }
  153.         My_ESP8266_Process();//處理串口數據
  154.     }   
  155. }

  156. void scanKeyAnddealKey(void)
  157. {
  158.         u8 i ;
  159.         u8 disYplace=0; //顯示所在行遞增變量
  160.         My_KeyScan();
  161.         if(KeyIsPress(KEY_4))
  162.         {
  163.             setMode++;//模式切換
  164.             if(setMode >= 3 )setMode =0;//模式切換
  165.         }
  166.         switch(setMode)
  167.         {
  168.             case 0: //自動模式
  169.                         if(KeyIsPress(KEY_1))
  170.                         {
  171.                             setParaCount++;//切換設置當前參數
  172.                             if(setParaCount>=MAX_SET_SIZE-2)
  173.                             {
  174.                                 setParaCount=0;//設置當前參數
  175.                                 write_FlashBuf();//將設置量寫入flash
  176.                             }
  177.                         }
  178.                         if(KeyIsPress(KEY_2))
  179.                         {
  180.                             if(setParaTab[setParaCount]<100)setParaTab[setParaCount]++;
  181.                         }
  182.                         if(KeyIsPress(KEY_3))
  183.                         {
  184.                             if(setParaTab[setParaCount]>0)setParaTab[setParaCount]--;
  185.                         }
  186.                         break;
  187.             case 1: //手動模式
  188.                         if(KeyIsPress(KEY_3)){led_gl = !led_gl;} //手動切換狀態
  189.                         if(KeyIsPress(KEY_2)){devOpenFLag=0;}//啟動
  190.                         if(KeyIsPress(KEY_1)){devOpenFLag =1;}//手動切換狀態
  191.                         setParaCount=0;//取消設置
  192.                         break;
  193.             default: break;
  194.         }
  195.         if(HasKeyEvent()||updataDis==1)//有任何按鍵按下 或者需要數據更新 否則更新過于頻繁浪費時間
  196.         {
  197.             if(updataDis==1)write_FlashBuf();//將設置量寫入flash 可能串口數據有更新
  198.             updataDis =0;//需要數據更新 處理
  199.             disYplace=ALLPARA_START_Y;
  200.             FRONT_COLOR=Color16_LIGHTGRAY;
  201.             for(i=1;i<MAX_SET_SIZE-2;i++) //顯示設置位置及設置參數 設置數組第一個數據為空白非設置參數 所以從1開始
  202.             {
  203.                 sprintf(dis0,"%d  ",setParaTab[i]);
  204.                 MyLCD_Show(20,disYplace,dis0);//顯示
  205.                 if(i == setParaCount)
  206.                     {MyLCD_Show(19,disYplace++,">");}//對所在設置位置 顯示>
  207.                 //**All notes can be deleted and modified**//
  208.             }
  209.         }
  210. }


  211. void initLcdDisplay(void) //初始化液晶顯示
  212. {
  213.     u8 disYplace=0; //顯示所在行遞增變量
  214.    
  215.     LCD_Clear(Color16_BLACK);//清全屏
  216.     BACK_COLOR=Color16_BLACK;
  217.     FRONT_COLOR=Color16_LIGHTBLUE;
  218. //MyLCD_Show(5,0,"智能家居設備",24,0);//顯示
  219.     LCD_ShowString(LCD_GetPos_X(24,5),LCD_GetPos_Y(24,0),"智能家居設備",24,false);
  220.     FRONT_COLOR=Color16_LIGHTBLUE;
  221.     MyLCD_Show(4,2,"  參數         閾值   ");//顯示
  222.     FRONT_COLOR=Color16_LIGHTGRAY;disYplace=ALLPARA_START_Y; //開始依次顯示
  223.     MyLCD_Show(1,disYplace++,"光照: ");//顯示
  224.     MyLCD_Show(1,disYplace++,"溫度: ");//顯示
  225.     MyLCD_Show(1,disYplace++,"濕度: ");//顯示
  226.     MyLCD_Show(1,disYplace++,"雨水: ");//顯示
  227.     MyLCD_Show(1,disYplace++,"設備狀態: ");//顯示
  228.     MyLCD_Show(1,disYplace++,"LED狀態 : ");//顯示
  229.     MyLCD_Show(1,disYplace++,"模式: ");//顯示
  230.     MyLCD_Show(1,disYplace++,"開時間段: ");//顯示

  231. }

  232. void displayOfCollectedData(void) //在disFlag 中處理
  233. {
  234.     static u8  remDevFlag =0xff;//記錄上一次 繼電器 設置狀態
  235.     static u8  remLedFlag =0xff;//記錄上一次 led 設置狀態
  236.     static u8 rememberMode =0xff;//記錄上一次設置狀態
  237.     static u16  remStartTp =0xffff;//記錄上一次 起始時間點
  238.     static u16  remStopTp =0xffff;//記錄上一次 結束時間點
  239.         
  240.     u8 disYplace=0;//顯示所在行遞增變量
  241.         
  242.     disYplace=ALLPARA_START_Y; //檢測異常參數
  243.     if(nowLigh<=setParaTab[1]){FRONT_COLOR=Color16_RED;}//切換 顯示顏色
  244.     else FRONT_COLOR=Color16_LIGHTBLUE;//切換 顯示顏色
  245.     sprintf(dis0,"%2d ",nowLigh);
  246.     MyLCD_Show(7,disYplace++,dis0);//顯示

  247.     if(DHT11_GetTemp(0)>setParaTab[2]){FRONT_COLOR=Color16_RED;}//切換 顯示顏色
  248.     else FRONT_COLOR=Color16_LIGHTBLUE;//切換 顯示顏色
  249.     sprintf(dis0,"%02d'C ",DHT11_GetTemp(0));
  250.     MyLCD_Show(7,disYplace++,dis0);//顯示

  251.     if(DHT11_GetHumi(0)>setParaTab[3]){FRONT_COLOR=Color16_RED;}//切換 顯示顏色
  252.     else FRONT_COLOR=Color16_LIGHTBLUE;//切換 顯示顏色
  253.     sprintf(dis0,"%02d%% ",DHT11_GetHumi(0));
  254.     MyLCD_Show(7,disYplace++,dis0);//顯示

  255.     if(nowYedi>setParaTab[4]){FRONT_COLOR=Color16_RED;}//切換 顯示顏色
  256.     else FRONT_COLOR=Color16_LIGHTBLUE;//切換 顯示顏色
  257.     sprintf(dis0,"%2d ",nowYedi);
  258.     MyLCD_Show(7,disYplace++,dis0);//顯示

  259.     FRONT_COLOR=Color16_LIGHTBLUE;
  260.     if(remDevFlag != devOpenFLag) //繼電器狀態發生變化
  261.     {
  262.         remDevFlag = devOpenFLag;
  263.         if(devOpenFLag == 0)MyLCD_Show(11,disYplace," 關 ");//顯示
  264.         else MyLCD_Show(11,disYplace," 開 ");//顯示
  265.     }disYplace++;
  266.    
  267.     if(remLedFlag != led_gl) //LED狀態發生變化
  268.     {
  269.         remLedFlag = led_gl;
  270.         if(led_gl == LED_OFF)MyLCD_Show(11,disYplace," 關 ");//顯示
  271.         else MyLCD_Show(11,disYplace," 開 ");//顯示
  272.     }disYplace++;
  273.    
  274.     if(rememberMode != setMode)
  275.     {
  276.         rememberMode = setMode;//記錄設置模式
  277.         if(setMode == 0)MyLCD_Show(6,disYplace,"  自動  ");//顯示
  278.         else if(setMode == 1)MyLCD_Show(6,disYplace,"  手動  ");//顯示
  279.         else if(setMode == 2)MyLCD_Show(6,disYplace,"  定時  ");//顯示
  280.     }disYplace++;

  281.     if(remStartTp!=timeStart1 || remStopTp!=timeStop1)
  282.     {
  283.         remStartTp = timeStart1;remStopTp=timeStop1;
  284.         sprintf(dis0,"%02d:%02d-%02d:%02d ",timeStart1/100,timeStart1%100,timeStop1/100,timeStop1%100);
  285.         MyLCD_Show(11,disYplace,dis0);//顯示
  286.     }disYplace++;
  287.    
  288. }

  289. //#define FLASH_SAVE_ADDR  0X0800f800  
  290. #define FLASH_SAVE_ADDR             FLASH_BASE_ADDR+(STM32_FLASH_SIZE-1)*STM_SECTOR_SIZE
  291. // STM32F103C8T6 64KB FLASH,20KB RAM,1個扇區1KB,程序起始0x0800000到0x0800FFFF
  292. //建議使用0X0800e800 0X0800f000 0X0800F800
  293. /******************把數據保存到單片機內部eepom中******************/
  294. void write_FlashBuf(void)
  295. {
  296.         setParaTab[5]=timeStart1;
  297.         setParaTab[6]=timeStop1;
  298.     My_STMFlash_Write(FLASH_SAVE_ADDR,(u16*)setParaTab,MAX_SET_SIZE);//讀取數據
  299. }

  300. /******************把數據從單片機內部eepom中讀出來*****************/
  301. void read_FlashBuf(void)
  302. {
  303.     My_STMFlash_Read(FLASH_SAVE_ADDR,(u16*)setParaTab,MAX_SET_SIZE);//讀取數據
  304.     timeStart1=setParaTab[5];
  305.     timeStop1 =setParaTab[6];
  306. }

  307. ……………………

  308. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

STM32單片機智能窗簾窗戶衣TFT屏138-STM32-138-RW2_4.7z

7.69 MB, 下載次數: 26

回復

使用道具 舉報

ID:1024398 發表于 2022-5-8 15:21 | 顯示全部樓層
麻煩老哥們幫幫忙,
回復

使用道具 舉報

ID:96682 發表于 2022-5-9 11:25 來自手機 | 顯示全部樓層
把原程序燒入目標芯片前還需正確設置各選項環節,不知樓主的問題出在哪里
回復

使用道具 舉報

ID:123289 發表于 2022-5-9 11:28 | 顯示全部樓層
一步步地調試,看看哪里與你的程序不符。
回復

使用道具 舉報

ID:1024398 發表于 2022-5-9 12:35 來自手機 | 顯示全部樓層
源程序是有問題的,被刪減了幾行
回復

使用道具 舉報

ID:1025260 發表于 2022-5-10 07:12 來自手機 | 顯示全部樓層
源程序有問題,多調試一下
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产大片黄色 | 国产综合精品 | 精品乱码一区二区三四区视频 | av在线一区二区三区 | 91一区二区三区 | 91在线观看免费视频 | 天天玩夜夜操 | 欧美成人a∨高清免费观看 欧美日韩中 | 久久久久综合 | 国产久 | 精品免费视频一区二区 | 国产精品永久在线观看 | 欧美在线a | 黄色欧美 | 五月网婷婷 | 一级黄色片一级黄色片 | 91精品久久久久久久久久入口 | 羞羞在线观看视频 | 日日摸夜夜添夜夜添精品视频 | 亚洲一区日韩 | 日韩国产三区 | 99久久99| 91麻豆久久久 | 国产农村妇女精品一区 | 亚洲精品久久视频 | 欧美精品久久久 | 国产精品久久久久无码av | 在线亚洲一区 | 黄色毛片网站在线观看 | 99精品国自产在线 | 国内精品久久久久久 | 在线中文字幕亚洲 | 久久久久国产一区二区三区 | 亚洲精品久久久久久久久久久久久 | 国产欧美一级二级三级在线视频 | 96av麻豆蜜桃一区二区 | 欧美一级欧美一级在线播放 | 欧美一级片在线看 | 成人在线观看亚洲 | 成年人黄色免费视频 | 免费在线视频精品 |