使用arduino uno开发板,1602显示模块,矩阵键盘,水位传感器,蜂鸣器,继电器,直流电机实现在串口1602显示模块上显示当前的水深位置 ;可通过操作矩阵键盘,设置水位最高报警值,并且掉电不丢失;可通过操作,设置直流电机停止条件(水位低于报警值多少 mm 时水泵停止),并且掉电不丢失;当水位深度超过报警值(30mm)时,蜂鸣器响,启动水泵(用直流电机模拟)将水抽走;当水位低于报警值(10mm)时,蜂鸣器和电机停止工作的代码
时间: 2024-03-23 11:40:03 浏览: 51
以下是示例代码,仅供参考:
```C++
#include <LiquidCrystal.h> // 1602显示模块库
#include <EEPROM.h> // EEPROM库
#include <Keypad.h> // 矩阵键盘库
// 1602显示模块引脚定义
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// 矩阵键盘引脚定义
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {13, 10, A5, A4};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// 水位传感器引脚定义
const int waterSensorPin = A0;
// 继电器引脚定义
const int relayPin = A3;
// 直流电机引脚定义
const int motorPin = A2;
// 蜂鸣器引脚定义
const int buzzerPin = A1;
// 水位深度
int waterLevel = 0;
// 报警值
int alarmValue = 0;
// 设置最高报警值
void setAlarmValue() {
lcd.clear();
lcd.print("Set Alarm Value:");
int value = 0;
while (1) {
char key = keypad.getKey();
if (key >= '0' && key <= '9') {
value = value * 10 + (key - '0');
lcd.setCursor(0, 1);
lcd.print(value);
} else if (key == '#') {
alarmValue = value;
EEPROM.write(0, alarmValue);
lcd.clear();
lcd.print("Set Success");
delay(1000);
break;
}
}
}
// 设置直流电机停止条件
void setMotorStopValue() {
lcd.clear();
lcd.print("Set Stop Value:");
int value = 0;
while (1) {
char key = keypad.getKey();
if (key >= '0' && key <= '9') {
value = value * 10 + (key - '0');
lcd.setCursor(0, 1);
lcd.print(value);
} else if (key == '#') {
EEPROM.write(1, value);
lcd.clear();
lcd.print("Set Success");
delay(1000);
break;
}
}
}
void setup() {
lcd.begin(16, 2);
lcd.print("Water Level:");
pinMode(relayPin, OUTPUT);
pinMode(motorPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
alarmValue = EEPROM.read(0);
}
void loop() {
// 读取水位传感器数值
waterLevel = analogRead(waterSensorPin);
waterLevel = map(waterLevel, 0, 1023, 0, 40);
lcd.setCursor(0, 1);
lcd.print(waterLevel);
lcd.print("mm");
// 判断是否超过最高报警值
if (waterLevel >= alarmValue) {
digitalWrite(relayPin, HIGH);
digitalWrite(motorPin, HIGH);
digitalWrite(buzzerPin, HIGH);
} else if (waterLevel <= alarmValue - EEPROM.read(1)) {
digitalWrite(relayPin, LOW);
digitalWrite(motorPin, LOW);
digitalWrite(buzzerPin, LOW);
}
// 操作矩阵键盘
char key = keypad.getKey();
if (key == 'A') {
setAlarmValue();
} else if (key == 'B') {
setMotorStopValue();
}
}
```
需要注意的是,本示例代码仅供参考,具体实现可能需要根据实际情况进行修改。同时,需要根据实际使用的电机、继电器等器件进行正确的接线和配置。
阅读全文