在某一个宝入的,但是再烧入时就不行了。
是基于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黑下载附件…………
复制代码 |