使用arduino uno开发板,1602显示模块,矩阵键盘,水位传感器,蜂鸣器,继电器,直流电机实现在串口1602显示模块上显示当前的水深位置 ;可通过操作矩阵键盘,设置水位最高报警值,并且掉电不丢失;可通过操作,设置直流电机停止条件(水位低于报警值多少 mm 时水泵停止),并且掉电不丢失;当水位深度超过报警值30mm时,蜂鸣器响,启动水泵(用直流电机模拟)将水抽走;当水位低于报警值10mm时,蜂鸣器和电机停止工作的代码
时间: 2024-03-22 10:39:58 浏览: 48
Arduino开发平台与继电器模块的使用_继电器模块_arduino_whistlerzj_Arduino继电器_
5星 · 资源好评率100%
下面是一个简单的实现代码,你可以参考一下:
```
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // 1602显示模块
const int buzzerPin = 10; // 蜂鸣器
const int relayPin = 9; // 继电器
const int motorPin = 6; // 直流电机
const int waterLevelPin = A0; // 水位传感器
const int ROWS = 4;
const int COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {8, 7, 6, 5}; // 矩阵键盘行引脚
byte colPins[COLS] = {4, 3, 2, A1}; // 矩阵键盘列引脚
int waterLevel = 0; // 当前水位
int maxWaterLevel = 0; // 水位最高报警值
void setup() {
pinMode(buzzerPin, OUTPUT);
pinMode(relayPin, OUTPUT);
pinMode(motorPin, OUTPUT);
lcd.begin(16, 2);
lcd.print("Water Level:");
for (int r = 0; r < ROWS; r++) {
pinMode(rowPins[r], INPUT_PULLUP);
}
for (int c = 0; c < COLS; c++) {
pinMode(colPins[c], OUTPUT);
digitalWrite(colPins[c], HIGH);
}
// 从EEPROM中读取最高报警值
maxWaterLevel = EEPROM.read(0);
}
void loop() {
waterLevel = analogRead(waterLevelPin);
waterLevel = map(waterLevel, 0, 1023, 0, 100); // 将水位传感器的值转换为0-100的百分比
lcd.setCursor(0, 1);
lcd.print(waterLevel);
lcd.print("% ");
if (waterLevel > maxWaterLevel + 30) {
digitalWrite(buzzerPin, HIGH);
digitalWrite(relayPin, HIGH); // 开启继电器
digitalWrite(motorPin, HIGH); // 开启电机
} else if (waterLevel < maxWaterLevel + 10) {
digitalWrite(buzzerPin, LOW);
digitalWrite(relayPin, LOW); // 关闭继电器
digitalWrite(motorPin, LOW); // 关闭电机
}
// 检测矩阵键盘输入
char key = getKey();
if (key != '\0') {
if (key >= '0' && key <= '9') {
maxWaterLevel = (maxWaterLevel * 10) + (key - '0');
} else if (key == '*') {
maxWaterLevel = 0;
} else if (key == '#') {
EEPROM.write(0, maxWaterLevel); // 将最高报警值写入EEPROM
}
}
}
char getKey() {
for (int c = 0; c < COLS; c++) {
digitalWrite(colPins[c], LOW);
for (int r = 0; r < ROWS; r++) {
if (digitalRead(rowPins[r]) == LOW) {
delay(50);
digitalWrite(colPins[c], HIGH);
return keys[r][c];
}
}
digitalWrite(colPins[c], HIGH);
}
return '\0';
}
```
注意:本代码仅作为参考,具体实现需要根据硬件连接和需求进行调整。另外,本代码中使用了EEPROM来保存最高报警值,掉电不丢失,但EEPROM有写入次数限制,请谨慎使用。
阅读全文