一、前言 这次报名的时候就是抱着试试看的心态参与,打算陪跑的,谁知道就中了啊啊啊,真的好开心,感谢园长,感谢安信可!! 因为之前一直在忙学校里的事,所以发帖可能晚了些,这不一有时间马上开干!这次我做的是一个检测电子屏幕使用距离的报警装置,众所周知嘛,咱们程序员一天有十几个小时都是盯着电子屏幕看的,所以说保持一个优雅的用眼姿势很重要,谁还记得咱们小时候背的那句“眼离书本一尺远、胸离书本一拳远、手离笔尖一寸远”呢,专家说,人离屏幕一般60cm以上最好,各模块的分工是这样:Rd-03E用来做人体检测,当检测到人体(大于30cm,即反馈0x01或0x02时)时启动系统,然后实时检测人离屏幕的距离,输出给OLED屏幕,矩阵灯是4*(8*8)的,通过灯亮的排数也能方便地获取距离,另外,这次本来是想用之前白嫖的Ai-M61-32SU的,但是它有一个LedControl库不支持,搞了一天也没有搞好,还是我太菜了,最后只能作罢,下次一定!
二、刷固件 - void setup() {
- pinMode(0,INPUT_PULLUP);
- pinMode(1,INPUT_PULLUP);
- }
- void loop() {
- }
复制代码
三、代码 - #include <Wire.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
- #include <LedControl.h>
- #define SCREEN_WIDTH 128 // OLED屏幕宽度,单位为像素
- #define SCREEN_HEIGHT 64 // OLED屏幕高度,单位为像素
- #define OLED_ADDRESS 0x3C // OLED的I2C地址
- // 定义连接到MAX7219的引脚
- const int DIN_PIN = 4;
- const int CS_PIN = 3;
- const int CLK_PIN = 2;
- int MAX_DEVICES = 4; // 共有4个模块
- float dist; //距离变量
- float max_length=60; //距离变量
- LedControl lc=LedControl(DIN_PIN,CLK_PIN,CS_PIN,MAX_DEVICES);
- Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_ADDRESS);
- void setup() {
- Serial.begin(25000);
- Wire.begin();// 启动I2C通信
- // 初始化OLED 12864显示屏
- if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDRESS)) {
- Serial.println(F("SSD1306初始化失败"));}
- // 初始化MAX7219
- init_LEDs();
- }
-
- void loop() {
- dist=processSerialData();
- if (dist!=-1){
- display_OLED(dist);
- //将距离转化为LED矩阵显示的行数
- dist=dist*32/max_length;
- controlLEDs(dist);
- delay(1000);
- init_LEDs();
- }
- }
- /**初始化MAX7219**/
- void init_LEDs(){
- for (int addr = 0; addr < MAX_DEVICES; addr++) {
- lc.shutdown(addr,false); // 唤醒显示
- lc.setIntensity(addr,1); // 设置亮度(0-15)
- lc.clearDisplay(addr); // 清除显示
- }
- }
- /**控制LED矩阵显示的行数**/
- void controlLEDs(int num) {
- int rows = num % 8; // 计算行数
- int modules = num / 8; // 计算模块数
- for (int j = 0; j < modules; j++) {
- for (int i = 0; i < 8; i++) {
- lc.setColumn(j, i, 0xFF); // 设置第i列为高电平(亮),其余为低电平(灭)
- delay(10);
- }
- }
- for (int i = 0; i < rows; i++) {
- lc.setColumn(modules, i, 0xFF); // 设置第i列为高电平(亮)
- delay(10);
- }
- }
- void display_OLED(float dist){
- display.clearDisplay();
- display.setTextSize(3);
- display.setTextColor(SSD1306_WHITE);//设置文本颜色
- display.setCursor(0, 10);
- if (dist>60){
- display.println(String(dist) + "cm");//显示距离
- } else {
- display.println("Warning !!!");//距离过近,显示Warning
- }
- display.display(); // 刷新屏幕
- }
- /**处理来自Rd-03E的数据**/
- float processSerialData() {
- byte variable[10];
- if(Serial.available()){
- delay(500);
- byte ava = Serial.available();
- while(ava--) {variable[6-ava] = Serial.read();}
- if(variable[2] == 0x02 || variable[2] == 0x01){//如果检测到微动人体
- dist = (variable[4] << 8) | variable[3];
- Serial.print("距离: ");
- Serial.println(dist);
- return dist;}
- else {return -1;}
- }
- else {return -1;}
- }
复制代码
四、连线图 接线表 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 |
五、效果展示(PS:太丑了有木有) 1.上墙 2.大于60cm 3.小于60cm
The end,谢谢大家的观看 |