|
500黑幣
在某一個寶入的,但是再燒入時就不行了。
是基于STM32單片機的智能窗簾,程序是有問題奮斗了一晚上,實在不行了,有沒有大佬有里面的驅(qū)動程序
Snipaste_2022-05-08_08-22-04.png (2.56 MB, 下載次數(shù): 51)
下載附件
2022-5-8 08:22 上傳
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png (64.39 KB, 下載次數(shù): 51)
下載附件
2022-5-8 14:52 上傳
51hei.png (12.77 KB, 下載次數(shù): 50)
下載附件
2022-5-8 14:52 上傳
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};//要設(shè)置的閾值 順序為 0空白非設(shè)置狀態(tài) 1光照 2溫度 3濕度 4雨滴
- u8 setParaCount =0;//當(dāng)前要設(shè)置的變量在數(shù)組中位置
- u8 setMode =0;//設(shè)置模式
- u8 updataDis =1;//需要更新顯示標(biāo)志
- u16 timeStart1 = 8*100;//設(shè)置 開始時間為08:00
- u16 timeStop1 = 9*100;//設(shè)置 結(jié)束時間為09:00
- char dis0[50];//液晶顯示暫存數(shù)組
- char dis1[128];//液晶顯示暫存數(shù)組
- #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 //數(shù)據(jù)顯示行的起始值
- int nowYedi = 0;//液滴檢測
- int nowLigh = 0;//ad采集結(jié)果 光照值
- u8 disFlag = 0;//更新顯示
- u8 rememberTiemSe=0xff;//記錄當(dāng)前秒數(shù)據(jù) 數(shù)據(jù)沒有變化不更新顯示 因為lcd更新顯示很浪費時間
- u8 devOpenFLag =0;//用于記錄設(shè)備是否需要打開狀態(tài)
- u16 time_now = 0;//計算當(dāng)前的時間,用于比較
- void OnGetEspMessage(const _esp_msg_obj *espMsgRec)
- {
- char *strPtr;
- if((strPtr=strstr(espMsgRec->payload,"RTC"))!=NULL)//接收到rtc字符串 *RTC20200420173611#
- {
- My_RTC_SetStr(strPtr+3);//設(shè)置時間
- }
- 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;//關(guān)閉
- }
- if((strPtr=strstr(espMsgRec->payload,"DV"))!=NULL)//接收到字符串
- {
- if(*(strPtr+2)=='1')devOpenFLag = 1;//打開
- else if(*(strPtr+2)=='0')devOpenFLag = 0;//關(guān)閉
- }
- }
- updataDis=1;//需要更新顯示參數(shù)
- }
- 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中數(shù)據(jù)
-
- 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();//進入按鍵設(shè)置時鐘 如果是有無線通信的情況下 該按鍵設(shè)置可以取消
- MyLCD_Show(1,1,"WiFi init.. ");//顯示
- MyLCD_Show(1,2,"Please Waitting.. ");//顯示
- Esp8266_Init_StationAP("AUAISOUT000","");
- initLcdDisplay(); //上電初始化顯示內(nèi)容
- My_StepMotor_Init();//步進電機驅(qū)動 初始化
-
- while(1)
- {
- scanKeyAnddealKey(); //按鍵掃描及處理
- if(disFlag == 1)//更新顯示
- {
- disFlag =0;
- FRONT_COLOR=Color16_LIGHTBLUE;
- if(rememberTiemSe!=calendar.second) //時間發(fā)生了變化 更新顯示
- {
- 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次 然后將采集結(jié)果按照50-1800轉(zhuǎn)化為0-100顯示 也就是顯示比例
- if(nowYedi > 100) nowYedi= 99;//防止出現(xiàn)超過100%數(shù)據(jù)
-
- nowLigh = My_ADC_GetLight(ADC1,ADC_Channel_2,1); //讀取ad值 轉(zhuǎn)化為0-1000
- DHT11_ReadData(0);
-
- displayOfCollectedData();//顯示采集到的數(shù)據(jù) 并進行數(shù)據(jù)對比
- if(setMode == 0)//自動模式 異常數(shù)據(jù) 報警
- {
- 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;} //關(guān)閉設(shè)備
- else {devOpenFLag = 1;}
- }
- else if(setMode == 2)//定時模式
- {
- time_now = calendar.hour*100 + calendar.minute;//計算當(dāng)前時間
- if(time_now>=timeStart1 && time_now<=timeStop1)//如果當(dāng)前在定時時間范圍內(nèi)
- {devOpenFLag = 1;}//打開設(shè)備
- else
- {devOpenFLag = 0;} //關(guān)閉設(shè)備
- }
-
- if(devOpenFLag==1) //無論哪一種模式下 需要控制步進電器旋轉(zhuǎn)到一周
- {My_StepMotor_RotateToAngle(0,360);} //轉(zhuǎn)動一周
- else
- {My_StepMotor_RotateToAngle(0,0);}//轉(zhuǎn)動回原位置
-
- 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);//發(fā)送數(shù)據(jù)
- }
- My_ESP8266_Process();//處理串口數(shù)據(jù)
- }
- }
- 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++;//切換設(shè)置當(dāng)前參數(shù)
- if(setParaCount>=MAX_SET_SIZE-2)
- {
- setParaCount=0;//設(shè)置當(dāng)前參數(shù)
- write_FlashBuf();//將設(shè)置量寫入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;} //手動切換狀態(tài)
- if(KeyIsPress(KEY_2)){devOpenFLag=0;}//啟動
- if(KeyIsPress(KEY_1)){devOpenFLag =1;}//手動切換狀態(tài)
- setParaCount=0;//取消設(shè)置
- break;
- default: break;
- }
- if(HasKeyEvent()||updataDis==1)//有任何按鍵按下 或者需要數(shù)據(jù)更新 否則更新過于頻繁浪費時間
- {
- if(updataDis==1)write_FlashBuf();//將設(shè)置量寫入flash 可能串口數(shù)據(jù)有更新
- updataDis =0;//需要數(shù)據(jù)更新 處理
- disYplace=ALLPARA_START_Y;
- FRONT_COLOR=Color16_LIGHTGRAY;
- for(i=1;i<MAX_SET_SIZE-2;i++) //顯示設(shè)置位置及設(shè)置參數(shù) 設(shè)置數(shù)組第一個數(shù)據(jù)為空白非設(shè)置參數(shù) 所以從1開始
- {
- sprintf(dis0,"%d ",setParaTab[i]);
- MyLCD_Show(20,disYplace,dis0);//顯示
- if(i == setParaCount)
- {MyLCD_Show(19,disYplace++,">");}//對所在設(shè)置位置 顯示>
- //**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,"智能家居設(shè)備",24,0);//顯示
- LCD_ShowString(LCD_GetPos_X(24,5),LCD_GetPos_Y(24,0),"智能家居設(shè)備",24,false);
- FRONT_COLOR=Color16_LIGHTBLUE;
- MyLCD_Show(4,2," 參數(shù) 閾值 ");//顯示
- 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++,"設(shè)備狀態(tài): ");//顯示
- MyLCD_Show(1,disYplace++,"LED狀態(tài) : ");//顯示
- MyLCD_Show(1,disYplace++,"模式: ");//顯示
- MyLCD_Show(1,disYplace++,"開時間段: ");//顯示
- }
- void displayOfCollectedData(void) //在disFlag 中處理
- {
- static u8 remDevFlag =0xff;//記錄上一次 繼電器 設(shè)置狀態(tài)
- static u8 remLedFlag =0xff;//記錄上一次 led 設(shè)置狀態(tài)
- static u8 rememberMode =0xff;//記錄上一次設(shè)置狀態(tài)
- static u16 remStartTp =0xffff;//記錄上一次 起始時間點
- static u16 remStopTp =0xffff;//記錄上一次 結(jié)束時間點
-
- u8 disYplace=0;//顯示所在行遞增變量
-
- disYplace=ALLPARA_START_Y; //檢測異常參數(shù)
- 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) //繼電器狀態(tài)發(fā)生變化
- {
- remDevFlag = devOpenFLag;
- if(devOpenFLag == 0)MyLCD_Show(11,disYplace," 關(guān) ");//顯示
- else MyLCD_Show(11,disYplace," 開 ");//顯示
- }disYplace++;
-
- if(remLedFlag != led_gl) //LED狀態(tài)發(fā)生變化
- {
- remLedFlag = led_gl;
- if(led_gl == LED_OFF)MyLCD_Show(11,disYplace," 關(guān) ");//顯示
- else MyLCD_Show(11,disYplace," 開 ");//顯示
- }disYplace++;
-
- if(rememberMode != setMode)
- {
- rememberMode = setMode;//記錄設(shè)置模式
- 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個扇區(qū)1KB,程序起始0x0800000到0x0800FFFF
- //建議使用0X0800e800 0X0800f000 0X0800F800
- /******************把數(shù)據(jù)保存到單片機內(nèi)部eepom中******************/
- void write_FlashBuf(void)
- {
- setParaTab[5]=timeStart1;
- setParaTab[6]=timeStop1;
- My_STMFlash_Write(FLASH_SAVE_ADDR,(u16*)setParaTab,MAX_SET_SIZE);//讀取數(shù)據(jù)
- }
- /******************把數(shù)據(jù)從單片機內(nèi)部eepom中讀出來*****************/
- void read_FlashBuf(void)
- {
- My_STMFlash_Read(FLASH_SAVE_ADDR,(u16*)setParaTab,MAX_SET_SIZE);//讀取數(shù)據(jù)
- timeStart1=setParaTab[5];
- timeStop1 =setParaTab[6];
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼 |
|