在某一個寶入的,但是再燒入時就不行了。
是基于STM32單片機的智能窗簾,程序是有問題奮斗了一晚上,實在不行了,有沒有大佬有里面的驅動程序
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
STM32單片機源程序如下:
- #include "my_include.h"
- //**All notes can be deleted and modified**//
- #define MAX_SET_SIZE 7
- u16 setParaTab[MAX_SET_SIZE]={0,50,32,65,20,8*100,9*100};//要設置的閾值 順序為 0空白非設置狀態 1光照 2溫度 3濕度 4雨滴
- u8 setParaCount =0;//當前要設置的變量在數組中位置
- u8 setMode =0;//設置模式
- u8 updataDis =1;//需要更新顯示標志
- u16 timeStart1 = 8*100;//設置 開始時間為08:00
- u16 timeStop1 = 9*100;//設置 結束時間為09:00
- char dis0[50];//液晶顯示暫存數組
- char dis1[128];//液晶顯示暫存數組
- #define F_SIZE 16
- #define MyLCD_Show(m,n,p) LCD_ShowString(LCD_GetPos_X(F_SIZE,m),LCD_GetPos_Y(24,n),p,F_SIZE,false)
- #define ALLPARA_START_Y 3 //數據顯示行的起始值
- int nowYedi = 0;//液滴檢測
- int nowLigh = 0;//ad采集結果 光照值
- u8 disFlag = 0;//更新顯示
- u8 rememberTiemSe=0xff;//記錄當前秒數據 數據沒有變化不更新顯示 因為lcd更新顯示很浪費時間
- u8 devOpenFLag =0;//用于記錄設備是否需要打開狀態
- u16 time_now = 0;//計算當前的時間,用于比較
- void OnGetEspMessage(const _esp_msg_obj *espMsgRec)
- {
- char *strPtr;
- if((strPtr=strstr(espMsgRec->payload,"RTC"))!=NULL)//接收到rtc字符串 *RTC20200420173611#
- {
- My_RTC_SetStr(strPtr+3);//設置時間
- }
- if((strPtr=strstr(espMsgRec->payload,"LG"))!=NULL)//接收到LG字符串 *50#
- {
- setParaTab[1]=ParseInteger(strPtr+2,2);//提取光照
- }
- if((strPtr=strstr(espMsgRec->payload,"WD"))!=NULL)//接收到rtc字符串
- {
- setParaTab[2]=ParseInteger(strPtr+2,2);//提取光照
- }
- if((strPtr=strstr(espMsgRec->payload,"SD"))!=NULL)//接收到rtc字符串
- {
- setParaTab[3]=ParseInteger(strPtr+2,2);//提取光照
- }
- if((strPtr=strstr(espMsgRec->payload,"YD"))!=NULL)//接收到rtc字符串
- {
- setParaTab[4]=ParseInteger(strPtr+2,2);//提取光照
- }
- if((strPtr=strstr(espMsgRec->payload,"TIME"))!=NULL)//接收到字符串*TIME0800-0900#
- {
- timeStart1 = ParseInteger(strPtr+4,4);//計算閾值
- timeStop1 = ParseInteger(strPtr+9,4);//計算閾值
- }
- if((strPtr=strstr(espMsgRec->payload,"MD"))!=NULL)//接收到字符串
- {
- if(*(strPtr+2)=='2')setMode = 2;//定時模式
- else if(*(strPtr+2)=='1')setMode = 1;//手動模式
- else if(*(strPtr+2)=='0')setMode = 0;//自動模式
- }
- if(setMode == 1)//手動模式下才進行控制
- {
- if((strPtr=strstr(espMsgRec->payload,"LD"))!=NULL)//接收到字符串
- {
- if(*(strPtr+2)=='1')led_gl = LED_ON;//打開
- else if(*(strPtr+2)=='0')led_gl = LED_OFF;//關閉
- }
- if((strPtr=strstr(espMsgRec->payload,"DV"))!=NULL)//接收到字符串
- {
- if(*(strPtr+2)=='1')devOpenFLag = 1;//打開
- else if(*(strPtr+2)=='0')devOpenFLag = 0;//關閉
- }
- }
- updataDis=1;//需要更新顯示參數
- }
- void initLcdDisplay(void);//初始化液晶顯示
- void scanKeyAnddealKey(void);
- void displayOfCollectedData(void);
- void write_FlashBuf(void);
- void read_FlashBuf(void);
- void init_FlashBuf(void);
- void keySetTime( void );
- int main(void)
- {
- USARTx_Init(USART1,9600); //初始化串口 及波特率
- USARTx_Init(USART2,2400);
- My_RTC_Init(false); //初始化 rtc
- My_ADC_Init(ADC1);
- My_KEY_Init();
- My_LED_Init(); //輸出初始化
-
- init_FlashBuf();//初始化flash中數據
-
- led_gl=0;//上電硬件動作下
- delay_ms(200);
- led_gl=1;
- LCD_Init(); //tft初始化
- DHT11_Init();//初始化dht11
- LCD_Clear(Color16_BLACK);//清全屏
- BACK_COLOR=Color16_BLACK;FRONT_COLOR=Color16_LIGHTBLUE;
- keySetTime();//進入按鍵設置時鐘 如果是有無線通信的情況下 該按鍵設置可以取消
- MyLCD_Show(1,1,"WiFi init.. ");//顯示
- MyLCD_Show(1,2,"Please Waitting.. ");//顯示
- Esp8266_Init_StationAP("AUAISOUT000","");
- initLcdDisplay(); //上電初始化顯示內容
- My_StepMotor_Init();//步進電機驅動 初始化
-
- while(1)
- {
- scanKeyAnddealKey(); //按鍵掃描及處理
- if(disFlag == 1)//更新顯示
- {
- disFlag =0;
- FRONT_COLOR=Color16_LIGHTBLUE;
- if(rememberTiemSe!=calendar.second) //時間發生了變化 更新顯示
- {
- rememberTiemSe = calendar.second;//記錄此刻時間
- sprintf((char*)dis0,"%04d-%02d-%02d %02d:%02d:%02d %d ",calendar.year,calendar.month,calendar.day,calendar.hour,calendar.minute,calendar.second,calendar.week);//年月日周
- MyLCD_Show(4,1,dis0);//顯示
- }
-
- nowYedi = 99 - My_ADC_GetPercent(ADC1,ADC_Channel_1,1,50,1850)*0.99;//m通道采集n次 然后將采集結果按照50-1800轉化為0-100顯示 也就是顯示比例
- if(nowYedi > 100) nowYedi= 99;//防止出現超過100%數據
-
- nowLigh = My_ADC_GetLight(ADC1,ADC_Channel_2,1); //讀取ad值 轉化為0-1000
- DHT11_ReadData(0);
-
- displayOfCollectedData();//顯示采集到的數據 并進行數據對比
- if(setMode == 0)//自動模式 異常數據 報警
- {
- if(nowLigh<setParaTab[1]){led_gl = LED_ON;} //光線過低 打開
- else {led_gl = LED_OFF;}
- if(nowLigh<setParaTab[1]||(DHT11_GetHumi(0)>setParaTab[3])||(nowYedi>setParaTab[4]))
- {devOpenFLag = 0;} //關閉設備
- else {devOpenFLag = 1;}
- }
- else if(setMode == 2)//定時模式
- {
- time_now = calendar.hour*100 + calendar.minute;//計算當前時間
- if(time_now>=timeStart1 && time_now<=timeStop1)//如果當前在定時時間范圍內
- {devOpenFLag = 1;}//打開設備
- else
- {devOpenFLag = 0;} //關閉設備
- }
-
- if(devOpenFLag==1) //無論哪一種模式下 需要控制步進電器旋轉到一周
- {My_StepMotor_RotateToAngle(0,360);} //轉動一周
- else
- {My_StepMotor_RotateToAngle(0,0);}//轉動回原位置
-
- sprintf((char*)dis1,"*D%04d%02d%02d%02d%02d%02d",calendar.year,calendar.month,calendar.day,calendar.hour,calendar.minute,calendar.second);//年月日周
- sprintf(dis1,"G%03dT%03dH%03dY%03d",nowLigh,DHT11_GetTemp(0),DHT11_GetHumi(0),nowYedi);
- sprintf((char*)dis1,"P%04d%04d",timeStart1,timeStop1);
- sprintf(dis1,"g%03dt%03dh%03dy%03d",setParaTab[1],setParaTab[2],setParaTab[3],setParaTab[4]);
- sprintf(dis1,"%s%sM%d#",(devOpenFLag == 1)?"R1":"R0",(led_gl == 0)?"L1":"L0",(int)setMode);
-
- My_ESP8266_SendStrToAll(dis1);//發送數據
- }
- My_ESP8266_Process();//處理串口數據
- }
- }
- void scanKeyAnddealKey(void)
- {
- u8 i ;
- u8 disYplace=0; //顯示所在行遞增變量
- My_KeyScan();
- if(KeyIsPress(KEY_4))
- {
- setMode++;//模式切換
- if(setMode >= 3 )setMode =0;//模式切換
- }
- switch(setMode)
- {
- case 0: //自動模式
- if(KeyIsPress(KEY_1))
- {
- setParaCount++;//切換設置當前參數
- if(setParaCount>=MAX_SET_SIZE-2)
- {
- setParaCount=0;//設置當前參數
- write_FlashBuf();//將設置量寫入flash
- }
- }
- if(KeyIsPress(KEY_2))
- {
- if(setParaTab[setParaCount]<100)setParaTab[setParaCount]++;
- }
- if(KeyIsPress(KEY_3))
- {
- if(setParaTab[setParaCount]>0)setParaTab[setParaCount]--;
- }
- break;
- case 1: //手動模式
- if(KeyIsPress(KEY_3)){led_gl = !led_gl;} //手動切換狀態
- if(KeyIsPress(KEY_2)){devOpenFLag=0;}//啟動
- if(KeyIsPress(KEY_1)){devOpenFLag =1;}//手動切換狀態
- setParaCount=0;//取消設置
- break;
- default: break;
- }
- if(HasKeyEvent()||updataDis==1)//有任何按鍵按下 或者需要數據更新 否則更新過于頻繁浪費時間
- {
- if(updataDis==1)write_FlashBuf();//將設置量寫入flash 可能串口數據有更新
- updataDis =0;//需要數據更新 處理
- disYplace=ALLPARA_START_Y;
- FRONT_COLOR=Color16_LIGHTGRAY;
- for(i=1;i<MAX_SET_SIZE-2;i++) //顯示設置位置及設置參數 設置數組第一個數據為空白非設置參數 所以從1開始
- {
- sprintf(dis0,"%d ",setParaTab[i]);
- MyLCD_Show(20,disYplace,dis0);//顯示
- if(i == setParaCount)
- {MyLCD_Show(19,disYplace++,">");}//對所在設置位置 顯示>
- //**All notes can be deleted and modified**//
- }
- }
- }
- void initLcdDisplay(void) //初始化液晶顯示
- {
- u8 disYplace=0; //顯示所在行遞增變量
-
- LCD_Clear(Color16_BLACK);//清全屏
- BACK_COLOR=Color16_BLACK;
- FRONT_COLOR=Color16_LIGHTBLUE;
- //MyLCD_Show(5,0,"智能家居設備",24,0);//顯示
- LCD_ShowString(LCD_GetPos_X(24,5),LCD_GetPos_Y(24,0),"智能家居設備",24,false);
- FRONT_COLOR=Color16_LIGHTBLUE;
- MyLCD_Show(4,2," 參數 閾值 ");//顯示
- FRONT_COLOR=Color16_LIGHTGRAY;disYplace=ALLPARA_START_Y; //開始依次顯示
- MyLCD_Show(1,disYplace++,"光照: ");//顯示
- MyLCD_Show(1,disYplace++,"溫度: ");//顯示
- MyLCD_Show(1,disYplace++,"濕度: ");//顯示
- MyLCD_Show(1,disYplace++,"雨水: ");//顯示
- MyLCD_Show(1,disYplace++,"設備狀態: ");//顯示
- MyLCD_Show(1,disYplace++,"LED狀態 : ");//顯示
- MyLCD_Show(1,disYplace++,"模式: ");//顯示
- MyLCD_Show(1,disYplace++,"開時間段: ");//顯示
- }
- void displayOfCollectedData(void) //在disFlag 中處理
- {
- static u8 remDevFlag =0xff;//記錄上一次 繼電器 設置狀態
- static u8 remLedFlag =0xff;//記錄上一次 led 設置狀態
- static u8 rememberMode =0xff;//記錄上一次設置狀態
- static u16 remStartTp =0xffff;//記錄上一次 起始時間點
- static u16 remStopTp =0xffff;//記錄上一次 結束時間點
-
- u8 disYplace=0;//顯示所在行遞增變量
-
- disYplace=ALLPARA_START_Y; //檢測異常參數
- if(nowLigh<=setParaTab[1]){FRONT_COLOR=Color16_RED;}//切換 顯示顏色
- else FRONT_COLOR=Color16_LIGHTBLUE;//切換 顯示顏色
- sprintf(dis0,"%2d ",nowLigh);
- MyLCD_Show(7,disYplace++,dis0);//顯示
- if(DHT11_GetTemp(0)>setParaTab[2]){FRONT_COLOR=Color16_RED;}//切換 顯示顏色
- else FRONT_COLOR=Color16_LIGHTBLUE;//切換 顯示顏色
- sprintf(dis0,"%02d'C ",DHT11_GetTemp(0));
- MyLCD_Show(7,disYplace++,dis0);//顯示
- if(DHT11_GetHumi(0)>setParaTab[3]){FRONT_COLOR=Color16_RED;}//切換 顯示顏色
- else FRONT_COLOR=Color16_LIGHTBLUE;//切換 顯示顏色
- sprintf(dis0,"%02d%% ",DHT11_GetHumi(0));
- MyLCD_Show(7,disYplace++,dis0);//顯示
- if(nowYedi>setParaTab[4]){FRONT_COLOR=Color16_RED;}//切換 顯示顏色
- else FRONT_COLOR=Color16_LIGHTBLUE;//切換 顯示顏色
- sprintf(dis0,"%2d ",nowYedi);
- MyLCD_Show(7,disYplace++,dis0);//顯示
- FRONT_COLOR=Color16_LIGHTBLUE;
- if(remDevFlag != devOpenFLag) //繼電器狀態發生變化
- {
- remDevFlag = devOpenFLag;
- if(devOpenFLag == 0)MyLCD_Show(11,disYplace," 關 ");//顯示
- else MyLCD_Show(11,disYplace," 開 ");//顯示
- }disYplace++;
-
- if(remLedFlag != led_gl) //LED狀態發生變化
- {
- remLedFlag = led_gl;
- if(led_gl == LED_OFF)MyLCD_Show(11,disYplace," 關 ");//顯示
- else MyLCD_Show(11,disYplace," 開 ");//顯示
- }disYplace++;
-
- if(rememberMode != setMode)
- {
- rememberMode = setMode;//記錄設置模式
- if(setMode == 0)MyLCD_Show(6,disYplace," 自動 ");//顯示
- else if(setMode == 1)MyLCD_Show(6,disYplace," 手動 ");//顯示
- else if(setMode == 2)MyLCD_Show(6,disYplace," 定時 ");//顯示
- }disYplace++;
- if(remStartTp!=timeStart1 || remStopTp!=timeStop1)
- {
- remStartTp = timeStart1;remStopTp=timeStop1;
- sprintf(dis0,"%02d:%02d-%02d:%02d ",timeStart1/100,timeStart1%100,timeStop1/100,timeStop1%100);
- MyLCD_Show(11,disYplace,dis0);//顯示
- }disYplace++;
-
- }
- //#define FLASH_SAVE_ADDR 0X0800f800
- #define FLASH_SAVE_ADDR FLASH_BASE_ADDR+(STM32_FLASH_SIZE-1)*STM_SECTOR_SIZE
- // STM32F103C8T6 64KB FLASH,20KB RAM,1個扇區1KB,程序起始0x0800000到0x0800FFFF
- //建議使用0X0800e800 0X0800f000 0X0800F800
- /******************把數據保存到單片機內部eepom中******************/
- void write_FlashBuf(void)
- {
- setParaTab[5]=timeStart1;
- setParaTab[6]=timeStop1;
- My_STMFlash_Write(FLASH_SAVE_ADDR,(u16*)setParaTab,MAX_SET_SIZE);//讀取數據
- }
- /******************把數據從單片機內部eepom中讀出來*****************/
- void read_FlashBuf(void)
- {
- My_STMFlash_Read(FLASH_SAVE_ADDR,(u16*)setParaTab,MAX_SET_SIZE);//讀取數據
- timeStart1=setParaTab[5];
- timeStop1 =setParaTab[6];
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼 |