项目方案
通过读取 IO 接口的模拟值,进行电压转换,获取检测到的电压值,进一步通过电压-水位校准,实现水位高度的串口打印和串口绘图,实时水位监测功能。
电压转换
代码
void setup() {pinMode(19, INPUT);Serial.begin(115200);}void loop() {int val = analogRead(19); // analog value readingfloat vlt = val * (3.3 / (3199-21)); // real voltage conversionSerial.println(vlt);delay(200);}
按住 IO2 键的同时,短按 EN 键,进入下载模式,配置端口号后上传工程,复位运行程序。
效果
水位传感器
水位传感器(Water Sensor)可以检测水位高度(检测高度:0 - 40 mm),亦可用作雨滴传感器,用于各种天气状况的监测,检测是否下雨及雨量的大小,广泛应用于汽车自动刮水系统、智能灯光系统、洗衣机和智能天窗系统等。
模块简介
模块原理图
引脚定义

运行原理
当平行铜线之间有水时,水浸没的高度不同,电流不同。铜线间的电阻根据水位的变化而变化。
硬件连接
水位校准
工程代码
include <stdio.h>void setup() { pinMode(19, INPUT);Serial.begin(115200); } void loop() { int val = analogRead(19); // analog sensor valuefloat vlt = val * (3.3 / (3199-21)); // real voltage conversion float wl = 41.774 * vlt - 38.686; // water level (mm)Serial.print(val);Serial.print(","); Serial.print(vlt); Serial.print(","); Serial.println(wl); delay(200);}
效果演示
水位的数码管显示
硬件连接
S -> IO19
+ -> 3V3
- -> GND
SCLK -> IO23
RCLK -> IO24
DIO -> IO11

工程代码
#include <stdio.h>const int sensorPin = 19; // water-level sensor pin// 74HC595 引脚设置const int latchPin = 24; // RCLKconst int clockPin = 23; // SCLKconst int dataPin = 11; // DIOunsigned char num[]={0xC0, //"0"0xF9, //"1"0xA4, //"2"0xB0, //"3"0x99, //"4"0x92, //"5"0x82, //"6"0xF8, //"7"0x80, //"8"0x90 //"9"};void setup(){pinMode(latchPin,OUTPUT);pinMode(clockPin,OUTPUT);pinMode(dataPin,OUTPUT);pinMode(sensorPin, INPUT);// uart settingSerial.begin(115200);}/* ------------ loop for serial print and segment display -------------- */void loop() {int count = 0;int val = analogRead(sensorPin); // analog sensor valuefloat vlt = val * (3.3 / (3199-21)); // real voltage conversionfloat wl = 41.774 * vlt - 38.686; // water level (mm)//Serial.print("Analog Value: ");Serial.print(val); // in order to serial plotSerial.print(", ");//Serial.print("Voltage: ");Serial.print(vlt);//Serial.print("V");Serial.print(", ");//Serial.print("Water Level: ");Serial.println(wl);//Serial.println("mm");Serial.println((String)"Analog Value: " + val + ", Valtage: " + vlt + "V, Water Level: " + wl + "mm"); // serial print stringwhile (count < 25) // loop 25 times for delay 500ms (20ms every display){if (wl < 0){disp(0);}else{disp(wl); // display water level}count++;}}/* ------------ segment display number (dynamics scanning) -------------- */void disp(float n){int t = 5;int yi = ((int)(n*10))%10;int ge = (int)n%10;int shi = ((int)n/10)%10;int bai = ((int)n/100)%10;if(bai>0){shiftOut(dataPin,clockPin,MSBFIRST,num[bai]);}else{shiftOut(dataPin,clockPin,MSBFIRST,0xFF);}shiftOut(dataPin,clockPin,MSBFIRST,0b00001000);digitalWrite(latchPin, HIGH);delay(t);digitalWrite(latchPin,LOW);if(shi>0){shiftOut(dataPin,clockPin,MSBFIRST,num[shi]);}else{if(bai>0){shiftOut(dataPin,clockPin,MSBFIRST,num[0]);}else{shiftOut(dataPin,clockPin,MSBFIRST,0xFF);}}shiftOut(dataPin,clockPin,MSBFIRST,0b00000100);digitalWrite(latchPin, HIGH);delay(t);digitalWrite(latchPin,LOW);shiftOut(dataPin,clockPin,MSBFIRST,num[ge]&0x7F);//与运算加入小数点shiftOut(dataPin,clockPin,MSBFIRST,0b00000010);digitalWrite(latchPin, HIGH);delay(t);digitalWrite(latchPin,LOW);shiftOut(dataPin,clockPin,MSBFIRST,num[yi]);shiftOut(dataPin,clockPin,MSBFIRST,0b00000001);digitalWrite(latchPin, HIGH);delay(t);digitalWrite(latchPin,LOW);}/* ------------ shiftOut -------------- */void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val){uint8_t i;for (i = 0; i < 8; i++) {if (bitOrder == LSBFIRST)digitalWrite(dataPin, !!(val & (1 << i)));elsedigitalWrite(dataPin, !!(val & (1 << (7 - i))));digitalWrite(clockPin, HIGH);digitalWrite(clockPin, LOW);}}
●注意 shiftOut 函数需要定义;
●由于每次采样数值均存在较大波动,为了避免数码管动态刷新过于频繁,加入循环延长数据刷新时间;
●或者多次采样取平均值,进而减小水位数值的波动,使数码管的显示更稳定。
效果显示
数码管显示水位

动态

串口输出电压和水位值

动态水位的演化曲线

静态水位的演化曲线

微信改版,容易错过最新资讯和福利?
快将“安信可科技”设为星标⭐
可以第一时间接收小安的推送!
▼

上线!国产AI语音开发板,定制你的聊天伙伴助手
30元左右的60GHz毫米波雷达模组重磅登场!
安信可更多产品信息可进入以下链接查阅:
●开发资料:https://docs.ai-thinker.com/
●官方教程:https://blog.csdn.net/Boantong_
●安信可官网:www.ai-thinker.com
●安信可社区:https://bbs.ai-thinker.com
●业务咨询请联系:18022036575


