找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1521|回复: 5
打印 上一主题 下一主题
收起左侧

stm32单片机智能窗帘系统设计 再次烧入时就不行了 附程序原理图PCB

[复制链接]
跳转到指定楼层
楼主
500黑币
在某一个宝入的,但是再烧入时就不行了。
是基于STM32单片机的智能窗帘,程序是有问题奋斗了一晚上,实在不行了,有没有大佬有里面的驱动程序



Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


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, 下载次数: 25

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1024398 发表于 2022-5-8 15:21 | 只看该作者
麻烦老哥们帮帮忙,
回复

使用道具 举报

板凳
ID:96682 发表于 2022-5-9 11:25 来自手机 | 只看该作者
把原程序烧入目标芯片前还需正确设置各选项环节,不知楼主的问题出在哪里
回复

使用道具 举报

地板
ID:123289 发表于 2022-5-9 11:28 | 只看该作者
一步步地调试,看看哪里与你的程序不符。
回复

使用道具 举报

5#
ID:1024398 发表于 2022-5-9 12:35 来自手机 | 只看该作者
源程序是有问题的,被删减了几行
回复

使用道具 举报

6#
ID:1025260 发表于 2022-5-10 07:12 来自手机 | 只看该作者
源程序有问题,多调试一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表