项目场景:
连接树莓派AD转换器(PCF每隔0591)和水位传感器.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 ///水位检测15000mv 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)00/100 '0'; Tx[3]=(int)(adc_v_1*1000)0/10 '0'; Tx[4]=(int)(adc_v_1*1000) '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!"); } if (10 == A_text) { printf("water!"); } A_text=0; } */ return 0; }
问题:
不太清楚电压和其值的关系;
产品描述采用模拟和数字,我们不确定哪个更好。
解决方案:
基本的线性规律是通过实验给出的。