【雷达灯控】安信可Rd-03E + 矩阵灯 + 12864OLED + Arduino UNO

[复制链接]
查看689 | 回复10 | 2024-3-26 23:08:52 | 显示全部楼层 |阅读模式
本帖最后由 xxzz1122 于 2024-3-26 23:08 编辑

一、前言
       这次报名的时候就是抱着试试看的心态参与,打算陪跑的,谁知道就中了啊啊啊,真的好开心,感谢园长,感谢安信可!!
       因为之前一直在忙学校里的事,所以发帖可能晚了些,这不一有时间马上开干!这次我做的是一个检测电子屏幕使用距离的报警装置,众所周知嘛,咱们程序员一天有十几个小时都是盯着电子屏幕看的,所以说保持一个优雅的用眼姿势很重要,谁还记得咱们小时候背的那句“眼离书本一尺远、胸离书本一拳远、手离笔尖一寸远”呢,专家说,人离屏幕一般60cm以上最好,各模块的分工是这样:Rd-03E用来做人体检测,当检测到人体(大于30cm,即反馈0x01或0x02时)时启动系统,然后实时检测人离屏幕的距离,输出给OLED屏幕,矩阵灯是4*(8*8)的,通过灯亮的排数也能方便地获取距离,另外,这次本来是想用之前白嫖的Ai-M61-32SU的,但是它有一个LedControl库不支持,搞了一天也没有搞好,还是我太菜了,最后只能作罢,下次一定!

二、刷固件
      模块出厂自带了手势识别固件,在这里我们参考七哥的帖子(https://bbs.ai-thinker.com/forum.php?mod=viewthread&tid=44286)刷上精准测距固件,再次感谢七哥!手头的CH340刚好坏了,不用着急,在这里我们可以复用Arduino的口,只需刷上以下代码即可,嘿嘿嘿
  1. void setup() {
  2. pinMode(0,INPUT_PULLUP);
  3. pinMode(1,INPUT_PULLUP);
  4. }
  5. void loop() {
  6. }
复制代码

2.jpg                 图片2.png




三、代码
       如果人体距离电脑屏幕超过60cm,则系统正常运行,矩阵灯会满格亮起,OLED实时打印出当前距离;若小于60cm,则OLED会发出Warning警告,矩阵灯会灭掉几行,具体取决于距离,如30cm会亮起30*32/60=16行,40cm会亮起40*32/60=21行,代码处理Rd-03E数据的部分参考了这位大佬的帖子(https://bbs.ai-thinker.com/forum.php?mod=viewthread&tid=44326),感谢!
  1. #include <Wire.h>
  2. #include <Adafruit_GFX.h>
  3. #include <Adafruit_SSD1306.h>
  4. #include <LedControl.h>
  5. #define SCREEN_WIDTH 128 // OLED屏幕宽度,单位为像素
  6. #define SCREEN_HEIGHT 64 // OLED屏幕高度,单位为像素
  7. #define OLED_ADDRESS 0x3C // OLED的I2C地址

  8. // 定义连接到MAX7219的引脚
  9. const int DIN_PIN = 4;
  10. const int CS_PIN  = 3;
  11. const int CLK_PIN = 2;
  12. int MAX_DEVICES = 4; // 共有4个模块
  13. float dist; //距离变量
  14. float max_length=60; //距离变量

  15. LedControl lc=LedControl(DIN_PIN,CLK_PIN,CS_PIN,MAX_DEVICES);
  16. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_ADDRESS);

  17. void setup() {
  18.   Serial.begin(25000);
  19.   Wire.begin();// 启动I2C通信
  20.    // 初始化OLED 12864显示屏
  21.   if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDRESS)) {
  22.   Serial.println(F("SSD1306初始化失败"));}
  23.    // 初始化MAX7219
  24.   init_LEDs();
  25. }

  26. void loop() {
  27.   dist=processSerialData();
  28.   if (dist!=-1){
  29.     display_OLED(dist);
  30.     //将距离转化为LED矩阵显示的行数
  31.     dist=dist*32/max_length;
  32.     controlLEDs(dist);
  33.     delay(1000);
  34.     init_LEDs();
  35.   }
  36. }

  37. /**初始化MAX7219**/
  38. void init_LEDs(){
  39.     for (int addr = 0; addr < MAX_DEVICES; addr++) {
  40.     lc.shutdown(addr,false);   // 唤醒显示
  41.     lc.setIntensity(addr,1);    // 设置亮度(0-15)
  42.     lc.clearDisplay(addr);      // 清除显示
  43.   }
  44. }

  45. /**控制LED矩阵显示的行数**/
  46. void controlLEDs(int num) {
  47.   int rows = num % 8; // 计算行数
  48.   int modules = num / 8; // 计算模块数
  49.   for (int j = 0; j < modules; j++) {
  50.     for (int i = 0; i < 8; i++) {
  51.       lc.setColumn(j, i, 0xFF); // 设置第i列为高电平(亮),其余为低电平(灭)
  52.       delay(10);
  53.     }
  54.   }
  55.   for (int i = 0; i < rows; i++) {
  56.     lc.setColumn(modules, i, 0xFF); // 设置第i列为高电平(亮)
  57.     delay(10);
  58.   }
  59. }

  60. void display_OLED(float dist){
  61.   display.clearDisplay();
  62.   display.setTextSize(3);
  63.   display.setTextColor(SSD1306_WHITE);//设置文本颜色
  64.   display.setCursor(0, 10);
  65.   if (dist>60){
  66.     display.println(String(dist) + "cm");//显示距离
  67.   } else {
  68.     display.println("Warning  !!!");//距离过近,显示Warning
  69.   }
  70.   display.display(); // 刷新屏幕
  71. }

  72. /**处理来自Rd-03E的数据**/
  73. float processSerialData() {
  74.   byte variable[10];
  75.   if(Serial.available()){
  76.       delay(500);
  77.       byte ava = Serial.available();
  78.       while(ava--) {variable[6-ava] = Serial.read();}
  79.       if(variable[2] == 0x02 || variable[2] == 0x01){//如果检测到微动人体
  80.         dist = (variable[4] << 8) | variable[3];
  81.         Serial.print("距离: ");
  82.         Serial.println(dist);
  83.         return dist;}
  84.       else {return -1;}
  85.     }
  86.   else {return -1;}
  87. }
复制代码

四、连线图
接线表
Rd-03E
Arduino
12864OLED
Arduino
MAX7219矩阵
Arduino
vcc
5v
vcc
5v
vcc
5v
gnd
gnd
gnd
gnd
gnd
gnd
OT1
0
SCL
A5
DIN
4

SDA
A4
CS
3


CLK
2
1(1).jpg

五、效果展示(PS:太丑了有木有)
1.上墙
1.jpg
2.大于60cm
3.jpg
3.小于60cm
1.jpg

The end,谢谢大家的观看

1.png
2.png
3.png
4.png
5.png
6.png
7.png
IMG_20240320_201624.jpg
图片1.png
IMG_20240326_132508(1).jpg
3.jpg
回复

使用道具 举报

1084504793 | 2024-3-27 08:17:09 | 显示全部楼层
回复

使用道具 举报

bzhou830 | 2024-3-27 08:35:12 | 显示全部楼层
这个灯好看
选择去发光,而不是被照亮
回复 支持 反对

使用道具 举报

爱笑 | 2024-3-27 08:36:10 | 显示全部楼层
不错不错,用心了。
用心做好保姆工作
回复 支持 反对

使用道具 举报

WT_0213 | 2024-3-27 08:46:11 | 显示全部楼层
漂亮
回复

使用道具 举报

lazy | 2024-3-27 09:16:36 | 显示全部楼层
回复

使用道具 举报

1055173307 | 2024-3-27 14:20:22 | 显示全部楼层
学习
回复

使用道具 举报

timo | 2024-4-4 11:26:05 | 显示全部楼层
回复

使用道具 举报

sansui | 2024-4-4 12:55:10 | 显示全部楼层
回复

使用道具 举报

物联网 | 2024-4-4 13:59:58 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则