带警报、LCD 和温度的超声波传感器
组件和用品
| | × | 1 | |
| Adafruit 标准 LCD - 16x2 蓝底白字 | | × | 1 | |
| | × | 1 | |
| Maxim Integrated DS18B20 可编程分辨率单线数字温度计 | | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 3 | |
| | × | 3 | |
| | × | 1 | |
| | × | 1 | |
关于这个项目
这个项目给了我我需要的关于水箱水位的信息。当电平低时,绿色 LED 亮起。当液位为中等时,黄色 LED 灯亮。当电平为 HIGH 时,红色 LED 灯同时闪烁,蜂鸣器发出声音。从传感器到水位的距离由超声波传感器测量,并与该水箱中的温度一起打印到 LCD 上。这个项目是一个更大项目的一部分。第二部分将是安装在一个圆圈中的 6 个追逐 LED,以指示泵正在泵送。参见:https://create.arduino.cc/projecthub/MichDragstar/arduino-uno-or-trinket-pro-5v-6-chasing-leds-with-pot-and-pb-23a1d7 第3部分将启动泵当液位高时停泵。(建设中)对于实际项目,我使用防水超声波传感器,这不会改变接线或代码。我不知道当传感器潮湿(湿度)时读数会发生什么变化,所以这个项目只是给我提供信息,第三个项目用于泵活动,将通过磁触点完成。
#include //Load Liquid Crystal Library#include #include #define ONE_WIRE_BUS 6 // 数据线插入Arduino OneWire的6脚oneWire(ONE_WIRE_BUS); // 设置 oneWire 实例以与任何 OneWire 设备通信//(不仅仅是 Maxim/Dallas 温度 IC)DallasTemperature sensor(&oneWire); // 将我们的oneWire 引用传递给Dallas Temperature.LiquidCrystal LCD(12, 11, 5, 4, 3, 2); //创建液晶对象LCDint trigPin =9; //Sensor Trip pin连接到Arduino pin 9int echoPin =7; //Sensor Echo pin连接到Arduino pin 7int myCounter =0; //声明你的变量 myCounter 并设置为 0float pingTime; //ping 从传感器到目标并返回浮动目标距离的时间; //以厘米为单位的目标距离float speedOfSound =776.5; //以英里每小时为单位的声音速度void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); LCD.begin(16, 2); //告诉Arduino启动你的16x2 LCD LCD.setCursor(0, 0); //设置LCD光标到左上角第0列第0行 LCD.print("Distance:"); //在第一行sensors.begin()上打印消息// 启动库 pinMode(8, OUTPUT); //引脚 8、10、13 输出引脚 pinMode(10, OUTPUT); pinMode(13, OUTPUT);}void loop() { digitalWrite(trigPin, LOW); //设置触发引脚低 delayMicroseconds(2000); //让信号稳定digitalWrite(trigPin, HIGH); //设置trigPin高delayMicroseconds(15); //高电平延时digitalWrite(trigPin, LOW); //ping 现在已经发送 delayMicroseconds(10); //高电平延时 pingTime =pulseIn(echoPin, HIGH); //以微秒为单位的pingTime pingTime =pingTime / 1000000; //通过除以 1000000(每秒微秒)将 pingTime 转换为秒 pingTime =pingTime / 3600; //通过除以 3600(一小时内的秒数)将 pingtime 转换为小时 targetDistance =speedOfSound * pingTime; //这将以英里为单位,因为我们将声速声明为公里/小时;虽然我们要把它转换回厘米 targetDistance =targetDistance / 2; //记住ping到达目标并从目标返回,因此您必须除以2才能获得实际目标距离。目标距离 =目标距离 * 160934.4; //通过乘以160934,4sensors.requestTemperatures()将英里转换为厘米; // 发送获取温度读数的命令 LCD.setCursor(10, 0); //设置光标到第一行第十列 LCD.print(" "); //打印空白以清除行 LCD.setCursor(10, 0); //再次设置Cursor到第一行第十列 LCD.print((int) (targetDistance + 0.5)); //打印测量距离 LCD.print("cm"); //打印你的单位 LCD.setCursor(0, 1); //设置光标到第二行第一列 LCD.print(" "); //打印空白以清除行 LCD.setCursor(0, 1); //再次设置光标到第二行的第一列 if (targetDistance> 40) { LCD.print("LEV LOW "); LCD.print(sensors.getTempCByIndex(0)); LCD.print((char)223); LCD.print("C"); } else if (targetDistance <40 &&targetDistance> 20) { LCD.print("LEV MED"); LCD.print(sensors.getTempCByIndex(0)); LCD.print((char)223); LCD.print("C"); } else (targetDistance <20); { LCD.print ("LEV HIGH"); LCD.print(sensors.getTempCByIndex(0)); LCD.print((char)223); LCD.print("C"); } 延迟(2000); if (targetDistance> 40) { digitalWrite (13, HIGH); //绿色 LED 亮 } else { digitalWrite(13, LOW); //绿色 LED 关闭 } if (targetDistance <40 &&targetDistance> 20) { digitalWrite (8, HIGH); //黄色 LED 亮 } else { digitalWrite(8, LOW); //黄色 LED 灯关闭 } if (targetDistance <20) { digitalWrite(10, HIGH); //红色 LED 开启延迟(2000);数字写入(10,低); //红色 LED 关闭 } else { digitalWrite(10, LOW); //红色LED关闭}}
代码
无标题文件C/C++
#include //加载液晶库#include #include #define ONE_WIRE_BUS 6 // 数据线插入Arduino OneWire oneWire(ONE_WIRE_BUS ); // 设置 oneWire 实例以与任何 OneWire 设备通信//(不仅仅是 Maxim/Dallas 温度 IC)DallasTemperature sensor(&oneWire); // 将我们的oneWire 引用传递给Dallas Temperature.LiquidCrystal LCD(12, 11, 5, 4, 3, 2); //创建液晶对象LCDint trigPin =9; //Sensor Trip pin连接到Arduino pin 9int echoPin =7; //Sensor Echo pin连接到Arduino pin 7int myCounter =0; //声明你的变量 myCounter 并设置为 0float pingTime; //ping 从传感器到目标并返回浮动目标距离的时间; //以厘米为单位的目标距离float speedOfSound =776.5; //以英里每小时为单位的声音速度void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); LCD.begin(16, 2); //告诉Arduino启动你的16x2 LCD LCD.setCursor(0, 0); //设置LCD光标到左上角第0列第0行 LCD.print("Distance:"); //在第一行sensors.begin()上打印消息// 启动库 pinMode(8, OUTPUT); //引脚 8、10、13 输出引脚 pinMode(10, OUTPUT); pinMode(13, OUTPUT);}void loop() { digitalWrite(trigPin, LOW); //设置触发引脚低 delayMicroseconds(2000); //让信号稳定digitalWrite(trigPin, HIGH); //设置trigPin高delayMicroseconds(15); //高电平延时digitalWrite(trigPin, LOW); //ping 现在已经发送 delayMicroseconds(10); //高电平延时 pingTime =pulseIn(echoPin, HIGH); //以微秒为单位的pingTime pingTime =pingTime / 1000000; //通过除以 1000000(每秒微秒)将 pingTime 转换为秒 pingTime =pingTime / 3600; //通过除以 3600(一小时内的秒数)将 pingtime 转换为小时 targetDistance =speedOfSound * pingTime; //这将以英里为单位,因为我们将声速声明为公里/小时;虽然我们要把它转换回厘米 targetDistance =targetDistance / 2; //记住ping到达目标并从目标返回,因此您必须除以2才能获得实际目标距离。目标距离 =目标距离 * 160934.4; //通过乘以160934,4sensors.requestTemperatures()将英里转换为厘米; // 发送获取温度读数的命令 LCD.setCursor(10, 0); //设置光标到第一行第十列 LCD.print(" "); //打印空白以清除行 LCD.setCursor(10, 0); //再次设置Cursor到第一行第十列 LCD.print((int) (targetDistance + 0.5)); //打印测量距离 LCD.print("cm"); //打印你的单位 LCD.setCursor(0, 1); //设置光标到第二行第一列 LCD.print(" "); //打印空白以清除行 LCD.setCursor(0, 1); //再次设置光标到第二行的第一列 if (targetDistance> 40) { LCD.print("LEV LOW "); LCD.print(sensors.getTempCByIndex(0)); LCD.print((char)223); LCD.print("C"); } else if (targetDistance <40 &&targetDistance> 20) { LCD.print("LEV MED"); LCD.print(sensors.getTempCByIndex(0)); LCD.print((char)223); LCD.print("C"); } else (targetDistance <20); { LCD.print ("LEV HIGH"); LCD.print(sensors.getTempCByIndex(0)); LCD.print((char)223); LCD.print("C"); } 延迟(2000); if (targetDistance> 40) { digitalWrite (13, HIGH); //绿色 LED 亮 } else { digitalWrite(13, LOW); //绿色 LED 关闭 } if (targetDistance <40 &&targetDistance> 20) { digitalWrite (8, HIGH); //黄色 LED 亮 } else { digitalWrite(8, LOW); //黄色 LED 灯关闭 } if (targetDistance <20) { digitalWrite(10, HIGH); //红色 LED 开启延迟(2000);数字写入(10,低); //红色 LED 关闭 } else { digitalWrite(10, LOW); //红色 LED 关闭 } }
示意图
lcd_pot_led_buzz_pb_distsens_temp_EHVdF6S1L7.fzz