[PSOC™] 【英飞凌PSOC 4000T DIY】水位检测仪

[复制链接]
 楼主| lulugl 发表于 2025-4-20 10:54 | 显示全部楼层 |阅读模式
<
【前言】
【英飞凌PSOC 4000T DIY】开发套件带了一个水位检测传感器,以及一个水杯,可谓考虑十分周全。同时也给了一个水位检测的示例,我这一篇将在他的示例基础之上,结合OLED显示屏,分享水位检测,并在OLED屏上显示数字标尺,以及图形化的柱状图。
【工程创建】
1、打开ModeusToobox,新建一个示例工程:

选择水平检测:

2、由于我需要使用OLED做为master,所以删除main.c中的I2C初始化以及中断等函数。
3、复制示例工程中的I2CMaster.c/h以及oled驱动库到工程中:

4、打开Device Configurator工具,配置I2C参数如下:

保存后,便可以使用I2CMaster与oled通信了。
5、编写画住状图的函数,传入地始坐标,宽度以及高度,颜色参数(传入0为清除框,1为画图)
  1. //画一个柱状图块图
  2. void drawBar(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t color)
  3. {
  4.     uint8_t i,j;
  5.     for (i = 0; i < width; i++)
  6.     {
  7.         for (j = 0; j < height; j++)
  8.         {
  9.             OLED_Set_Pixel(x + i, y + j, color);
  10.         }
  11.     }

  12. }


6、编写画水位图,传一个水位数(0-120),由于我们的最大像数为64,因此要进行高度换算,最后函数如下:

  1. //绘制水位图,传入参数为水位值,单位为cm,最大值为120,最小值为0  OLED的分辨率为128*64 画在右侧点32个像素点 高度为64个像素点
  2. void drawWaterLevel(uint8_t waterLevel)
  3. {
  4.     //计算高度
  5.     uint8_t height = waterLevel * 64 / 120;
  6.     //绘制柱状图
  7.     drawBar(96, 0, 24, 64, 0);
  8.     drawBar(96, 64 - height, 24, height, 1);
  9.     OLED_Display();  
  10. }
7、在main.c中引入oled驱动库。
8、在main.c中获取到的水位数为:level_wo_FR。因此把这个水位数进行OLED打印,并传入水柱函数中,实现显示:
  1.     for (;;)
  2.     {
  3.             uint32_t level_w_FR, level_wo_FR;

  4.         /* Scan the normal Liquid Level Widget */
  5.             Cy_CapSense_ScanWidget(CY_CAPSENSE_LIQUIDLEVEL0_WDGT_ID, &cy_capsense_context);
  6.         /* Wait until the scan is finished */
  7.         while(Cy_CapSense_IsBusy(&cy_capsense_context)) {}

  8.         /* Scan the Foam Rejection Widget */
  9.         Cy_CapSense_ScanWidget(CY_CAPSENSE_LIQUIDLEVEL0_FR_WDGT_ID, &cy_capsense_context);
  10.         /* Wait until the scan is finished */
  11.         while(Cy_CapSense_IsBusy(&cy_capsense_context)) {}

  12.         /* Process all th widgets */
  13.         Cy_CapSense_ProcessAllWidgets(&cy_capsense_context);



  14.         /* store the liquid level before and after foam rejection */
  15.         level_wo_FR = CY_CAPSENSE_LIQUIDLEVEL0_PTRPOSITION_VALUE->x;
  16.         level_w_FR = CY_CAPSENSE_LIQUIDLEVEL0_FR_PTRPOSITION_VALUE->x;
  17.         GUI_ShowString(10, 16, "Level:", 16, 1);
  18.         GUI_ShowNum(64, 16, level_wo_FR, 3, 16, 1);
  19.         drawWaterLevel((uint8_t)level_wo_FR);
  20.         
  21.         /* keep the compiler happy */
  22.         (void)level_wo_FR;
  23.         (void)level_w_FR;


  24.     }
【实验效果】
下载程序后,使用套件中的水位传感器,将他帖到套件中的杯子中,并插入开发中:

在杯中倒入适量的水,在OLED屏上就可以看到水位数了:

摆动水杯,水位线可以跟随变化。
【实验视频如下】

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
Amazingxixixi 发表于 2025-4-24 16:29 | 显示全部楼层
学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

180

主题

830

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部