野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19023|回复: 20

液晶实时显示温湿度工程

[复制链接]
发表于 2021-10-16 16:01:56 | 显示全部楼层 |阅读模式
液晶实时显示温湿度工程

此工程基于STM32F103ZET6开发
使用液晶屏幕为3.2寸ILI9341液晶屏、使用温湿度传感器为DHT11

在首次使用时需配置初始时间,之后由RTC自动提供

//下面两个函数用来设置初始日期和时间
DateChanged(year,month,day);
TimeModificatiopn(hour,minute,sec);

在屏幕显示及日期算法上进行了优化
此工程仅实现了30天以内的时间同步,假设待机时长超过30天会出现时间出错
如果超过30天未开机可使用RTC_Config()函数来重新初始化RTC来设置时间

在屏幕显示上采用区域刷新的方式
提升了视觉上的观赏性。

实时温湿度显示.zip

7.27 MB, 下载次数: 37

回复

使用道具 举报

 楼主| 发表于 2021-10-16 16:03:06 | 显示全部楼层
菜鸟初次制作,希望前辈多多指导。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-16 16:47:55 | 显示全部楼层
这个版本BUG巨多大家先别下载
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-16 17:18:13 | 显示全部楼层
有没有大佬帮忙解决一下,为什么下载两次才能正常显示
大家帮忙找找BUG
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-16 19:30:52 | 显示全部楼层
时间同步算法出错了,正在修改。
程序跑好久才能找出问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-16 19:37:46 | 显示全部楼层
稍微更新一下,在等出错

实时温湿度显示.zip

7.28 MB, 下载次数: 32

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-16 20:05:56 | 显示全部楼层
跑一个小时就出错。。。。
回复 支持 反对

使用道具 举报

发表于 2021-10-16 22:21:30 | 显示全部楼层
显示图片的函数有吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-17 12:02:57 | 显示全部楼层
lyg407 发表于 2021-10-16 22:21
显示图片的函数有吗?

我根据例程改的,就是开一个窗口填充像素
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-17 12:05:28 | 显示全部楼层
  1. PNG[]就是填充像素的数组
  2. CMD_SetPixel 写命令

  3. ILI9341_OpenWindow(0,0,240,320);
  4.    
  5.            ILI9341_Write_Cmd ( CMD_SetPixel );   
  6.           
  7.     for(i=0;i<sizeof(PNG);i+=2)
  8.     {
  9.         temp = PNG[i];
  10.         temp <<= 8;
  11.         temp |= PNG[i+1];
  12.         ILI9341_Write_Data (temp);      
  13.     }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-17 12:33:12 | 显示全部楼层
本帖最后由 一级菜鸟 于 2021-10-17 12:47 编辑

再一次更新时间同步算法,感兴趣的兄弟可以帮忙跑跑

实时温湿度显示.zip

7.27 MB, 下载次数: 31

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-17 13:08:43 | 显示全部楼层
对同步算法的再次改动
  1. //获取RTC的计数值
  2.     temp = RTC_GetCounter();
  3.    
  4.     //同步时间算法,仅实现到了天数同步,如果不开机时长超过30天左右会出现同步出错
  5.     if((temp/3600)>=24)
  6.     {
  7.        DateChanged(year,month,(day+(temp/(3600*24))));
  8.        if(TimeTest(year,month,day) == 1)
  9.        {
  10.            if((year%4==0)&&(month==2))
  11.            {
  12.                DateChanged(year,(month+1),(day-29));
  13.            }
  14.            if(month==2)
  15.            {
  16.                DateChanged(year,(month+1),(day-28));
  17.            }
  18.            if((month==4)||(month==6)||(month==9)||(month==11))
  19.            {
  20.                DateChanged(year,(month+1),(day-30));
  21.            }
  22.            if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))
  23.            {
  24.                DateChanged(year,(month+1),(day-31));
  25.            }
  26.        }
  27.        temp -= ((3600*24)*(temp/(3600*24)));        
  28.     }
  29.     if(temp<60)
  30.     {
  31.         TimeModificatiopn(hour,minute,sec+temp);
  32.         if(sec>60)
  33.         {
  34.             TimeModificatiopn(hour,(minute+1),(sec-60));
  35.         }
  36.     }
  37.     if(((temp/60)<60) && (temp>=60))
  38.     {   
  39.        TimeModificatiopn(hour,(minute+(temp/60)),(sec+(temp%60)));
  40.        if(minute > 60)
  41.        {
  42.            TimeModificatiopn((hour+1),(minute-60),sec);
  43.        }
  44.     }
  45.     if(((temp/3600)<24) && (temp>=3600))
  46.     {
  47.         if((temp%3600)<60)
  48.             {
  49.                 TimeModificatiopn((hour+(temp/3600)),minute,(sec+(temp%60)));
  50.                 if(hour>=24)
  51.                 {
  52.                     DateChanged(year,month,(day+1));
  53.                     if(TimeTest(year,month,day) == 1)
  54.                        {
  55.                            if((year%4==0)&&(month==2))
  56.                            {
  57.                                DateChanged(year,(month+1),(day-29));
  58.                            }
  59.                            if(month==2)
  60.                            {
  61.                                DateChanged(year,(month+1),(day-28));
  62.                            }
  63.                            if((month==4)||(month==6)||(month==9)||(month==11))
  64.                            {
  65.                                DateChanged(year,(month+1),(day-30));
  66.                            }
  67.                            if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))
  68.                            {
  69.                                DateChanged(year,(month+1),(day-31));
  70.                            }
  71.                        }
  72.                     TimeModificatiopn((hour-24),minute,sec);
  73.                     if(sec>60)
  74.                     {
  75.                         TimeModificatiopn(hour,(minute+1),(sec-60));
  76.                     }
  77.                 }
  78.             }
  79.         if((((temp%3600)/60)<60) && ((temp%3600)>=60))
  80.             {   
  81.                TimeModificatiopn((hour+(temp/3600)),(minute+((temp%3600)/60)),(sec+(temp%60)));
  82.                 if(hour>=24)
  83.                 {
  84.                     DateChanged(year,month,(day+1));
  85.                     if(TimeTest(year,month,day) == 1)
  86.                        {
  87.                            if((year%4==0)&&(month==2))
  88.                            {
  89.                                DateChanged(year,(month+1),(day-29));
  90.                            }
  91.                            if(month==2)
  92.                            {
  93.                                DateChanged(year,(month+1),(day-28));
  94.                            }
  95.                            if((month==4)||(month==6)||(month==9)||(month==11))
  96.                            {
  97.                                DateChanged(year,(month+1),(day-30));
  98.                            }
  99.                            if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))
  100.                            {
  101.                                DateChanged(year,(month+1),(day-31));
  102.                            }
  103.                        }
  104.                     TimeModificatiopn((hour-24),minute,sec);
  105.                     if(minute > 60)
  106.                    {
  107.                        TimeModificatiopn((hour+1),(minute-60),sec);
  108.                        if(sec>60)
  109.                         {
  110.                             TimeModificatiopn(hour,(minute+1),(sec-60));
  111.                         }
  112.                    }
  113.                 }
  114.             }
  115.     }  
复制代码
回复 支持 反对

使用道具 举报

发表于 2021-10-17 16:10:18 | 显示全部楼层

谢谢。 代码试了下,可以显示图片了,刚好也在学习LCD。
回复 支持 反对

使用道具 举报

发表于 2021-10-17 16:11:40 | 显示全部楼层
试了几次,取模显示效果不对。 原来要选择高位在前。
1取模方式.jpg
回复 支持 反对

使用道具 举报

发表于 2021-10-17 16:12:28 | 显示全部楼层
实际显示效果,比照片效果好一些。


2.jpg
回复 支持 反对

使用道具 举报

发表于 2021-10-17 16:21:37 | 显示全部楼层
  1. void ILI9341_DrawPicture_test (void)
  2. {
  3.         uint16_t temp = 0;
  4.         uint32_t i = 0;

  5.         ILI9341_OpenWindow(0,0,100,100);
  6.         ILI9341_Write_Cmd ( CMD_SetPixel );                  
  7.         for(i=0;i<sizeof(gImage_xiong1);i+=2)
  8.         {
  9.                 temp = gImage_xiong1[i];
  10.                 temp <<= 8;
  11.                 temp |= gImage_xiong1[i+1];
  12.                 ILI9341_Write_Data (temp);      
  13.         }
  14. }
  15. void ILI9341_DrawPicture ( uint16_t usX1, uint16_t usY1, uint16_t usX2, uint16_t usY2, uint8_t *PNG)
  16. {
  17.         uint16_t temp = 0;
  18.         uint32_t i = 0;
  19.        
  20.         ILI9341_OpenWindow(usX1,usY1,usX2,usY2);
  21.           ILI9341_Write_Cmd ( CMD_SetPixel );  
  22.     for(i=0;i<sizeof(PNG);i+=2)
  23.     {
  24.         temp = PNG[i];
  25.         temp <<= 8;
  26.         temp |= PNG[i+1];
  27.         ILI9341_Write_Data (temp);      
  28.     }
  29. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2021-10-17 16:22:14 | 显示全部楼层
  1. //显示图片
  2.   ILI9341_DrawPicture_test();

  3.   //显示图片2
  4.   ILI9341_DrawPicture(0, 0, 100, 100, (uint8_t *)gImage_xiong1);
  5.        
复制代码



为什么我封装成一个函数,就不能显示了。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-17 17:00:40 | 显示全部楼层
lyg407 发表于 2021-10-17 16:22
为什么我封装成一个函数,就不能显示了。。。

数组定义成全局
还有你传入的是地址指针指向PNG[0],你也可以采用指针的方式遍历
sizeof那里改一下应该就没问题了,成了取指针的大小了。
回复 支持 反对

使用道具 举报

发表于 2021-10-17 17:36:34 | 显示全部楼层
一级菜鸟 发表于 2021-10-17 17:00
数组定义成全局
还有你传入的是地址指针指向PNG[0],你也可以采用指针的方式遍历
sizeof那里改一下应该就没 ...

明白一点了。 我再想下试试。
回复 支持 反对

使用道具 举报

发表于 2021-10-17 20:45:36 | 显示全部楼层

写了一个测试可以了。

  1. void ILI9341_DrawPicture (uint16_t start_x,uint16_t start_y,uint16_t end_x,uint16_t end_y,uint8_t *pic)
  2. {
  3.         uint16_t temp = 0;
  4.         uint32_t i = 0;
  5.         uint32_t total;
  6.         uint8_t *picturepointer = pic;
  7.         //数组个数 像素点 宽*高 *2 (RGB565取模格式)
  8.         total = (end_x - start_x) * (end_y - start_y) * 2;
  9.         //在ILI9341显示器上开辟一个窗口
  10.         ILI9341_OpenWindow(start_x, start_y, end_x, end_y);
  11.         //填充像素命令
  12.         ILI9341_Write_Cmd ( CMD_SetPixel );
  13.         //读取数组 并合成一个16位数据
  14.         for(i=0; i<total; i+=2)
  15.         {
  16.                 temp = *(picturepointer+i);
  17.                 temp <<= 8;
  18.                 temp |= *(picturepointer+(i+1));
  19.                 ILI9341_Write_Data (temp);      
  20.         }
  21. }
复制代码


回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-17 20:54:39 | 显示全部楼层
lyg407 发表于 2021-10-17 20:45
写了一个测试可以了。

可以,很棒
你那个图片取模怎么配置的,我大小取到240*320之后就输出数据不够了
少一些数据,你试一下
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-12-5 22:14 , Processed in 0.057239 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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