项目场景:
通过树莓派连接AD转换器(PCF8591)和水位传感器,每隔0.1s进行一次检测
代码见下:
//液位传感器模块: VCC -> 5V; GND -> GND; DO -> DOPIN 0;AO ->A0;
#include <stdio.h>
#include <wiringPi.h>
#include <pcf8591.h>
#include <math.h>
#define PCF 120 //PCF8591的基地址
#define DOpin 0
#define power 5000 //PCF8591电压值为5000mv
#define have_water_v 1500 //水位检测1500mv
unsigned char Tx[5]; //发送电压字符串
int conersion_water(int mode);
/*
水位检测驱动
MODE==1 采用模拟检测
MODE==2 采用数字检测
有水 1
无水 10
*/
int conersion_water(int mode)
{
if (1==mode){
int value;
float adc_v;
// Setup pcf8591 on base pin 120, and address 0x48
pcf8591Setup (PCF, 0x48) ;
value=analogRead(PCF+0); //A0采样
adc_v=value *power/255; //8通道 5v供电 单位毫伏
//生成TX 用于发送至手机端
Tx[0]=(int)(adc_v_1*1000)/1000+'0';
Tx[1]='.';
Tx[2]=(int)(adc_v_1*1000)%1000/100+'0';
Tx[3]=(int)(adc_v_1*1000)%100/10+'0';
Tx[4]=(int)(adc_v_1*1000)%10+'0';
if (adc_v <have_water_v){
return 1; //本次检测有水, 需要连续检测10次,同样结果可以认可
}
if (adc_v >=have_water_v ) {
return 10;
} //本次检测无水 ,需要连续检测10次,同样结果可以认可
delay(100); //0.1s采样一次
//注释:等于号给谁需要讨论
}
if (2==mode){
if(digitalRead(DOpin)== 0) { //液位传感器用引脚为低电平
delay_ms(10); //延时防抖动
if(digitalRead(DOpin)== 0) { //液位传感器用引脚为低电平
return 1; //有水
}
else{
return 10; //无水
}
}
delay(90); //0.1s采样一次
}
}
int main(void)
{
int i;
int A_text;
A_text=0 // A_TEXT=10*10 or 10*1
int D_text;
D_text=0 // D_TEXT=10 or 1
if (wiringPiSetup()==-1){
printf("setup wiringpi filed!");
return 1;
}
//数字检测法
/*
while(1){
pinMode(DOpin, INPUT);
D_text=conersion_water(2);
if (1==D_text){
printf("water!");
}
if (10==D_text){
printf("no water!");
}
D_text=0;
}
*/
//模拟检测法
/*
while(1){
for (i=0;i<10;i++){
A_text=A_text+conersion_water(1);
}
if (100 == A_text) {
printf("no water!");
}
if (10 == A_text) {
printf("water!");
}
A_text=0;
}
*/
return 0;
}
问题:
不太清楚电压和其值的关系;
产品说明采用模拟和数字,我们不确定哪一种更好。
解决方案:
通过实验给出了基本的线性规律。