// 汉字点阵数据定义
const unsigned char an[] PROGMEM = {
0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x20,
0x00,0x00,0x20,0x00,0x0F,0xFF,0xC0,0x10,
0x00,0x80,0x30,0x81,0x00,0x00,0xC0,0x00,
0x00,0x80,0x00,0x3F,0xFB,0xC0,0x01,0x04,
0x00,0x03,0x04,0x00,0x02,0x08,0x00,0x06,
0x18,0x00,0x01,0xD0,0x00,0x00,0x2C,0x00,
0x00,0xC3,0x80,0x03,0x00,0xC0,0x1C,0x00,
0x40,0x00,0x00,0x00
}; /* "安" */
const unsigned char quan[] PROGMEM = {
0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xC0,
0x00,0x00,0xA0,0x00,0x01,0x10,0x00,0x03,
0x08,0x00,0x02,0x04,0x00,0x04,0x03,0x00,
0x1F,0xBF,0xE0,0x20,0x40,0x40,0x40,0x40,
0x00,0x00,0x40,0x00,0x07,0xFF,0x00,0x00,
0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,
0x00,0x40,0x00,0x1F,0xFF,0xC0,0x00,0x00,
0x00,0x00,0x00,0x00
}; /* "全" */
const unsigned char tong[] PROGMEM = {
0x00,0x00,0x00,0x00,0xFD,0x00,0x10,0x03,
0x80,0x18,0x34,0x00,0x08,0x18,0x00,0x01,
0xFF,0xC0,0x01,0x08,0x80,0x39,0x08,0x80,
0x09,0xFF,0x80,0x09,0x08,0x80,0x09,0xFF,
0x80,0x09,0x08,0x80,0x09,0x08,0x80,0x09,
0x08,0x80,0x09,0x09,0x80,0x34,0x00,0x00,
0x63,0xC0,0x60,0x00,0x7F,0xC0,0x00,0x00,
0x00,0x00,0x00,0x00
}; /* "通" */
const unsigned char xing[] PROGMEM = {
0x00,0x00,0x00,0x04,0x00,0x00,0x04,0x3F,
0x80,0x08,0x00,0x00,0x08,0x00,0x00,0x12,
0x00,0x00,0x22,0x00,0x00,0x04,0xFB,0xE0,
0x0C,0x04,0x00,0x0C,0x04,0x00,0x14,0x04,
0x00,0x24,0x04,0x00,0x44,0x04,0x00,0x04,
0x04,0x00,0x04,0x04,0x00,0x04,0x04,0x00,
0x04,0x04,0x00,0x04,0x1C,0x00,0x04,0x08,
0x00,0x00,0x00,0x00
}; /* "行" */
const unsigned char jin[] PROGMEM = {
0x00,0x00,0x00,0x06,0x06,0x00,0x02,0x04,
0x00,0x3B,0xFD,0xC0,0x06,0x06,0x00,0x0B,
0x0E,0x00,0x0A,0x95,0x00,0x12,0x94,0xC0,
0x22,0x24,0x40,0x46,0x44,0x00,0x07,0xFF,
0x00,0x00,0x00,0x00,0x3F,0xDF,0xE0,0x00,
0x20,0x00,0x03,0x24,0x00,0x04,0x23,0x00,
0x08,0x21,0x80,0x31,0xE0,0x80,0x00,0x40,
0x00,0x00,0x00,0x00
}; /* "禁" */
const unsigned char zhi[] PROGMEM = {
0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,
0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,
0x20,0x00,0x04,0x20,0x80,0x04,0x3F,0xC0,
0x04,0x20,0x00,0x04,0x20,0x00,0x04,0x20,
0x00,0x04,0x20,0x00,0x04,0x20,0x00,0x04,
0x20,0x00,0x04,0x20,0x40,0x3F,0xFF,0xE0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
}; /* "止" */
const unsigned char xiao[] PROGMEM = {
0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,
0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,
0x20,0x00,0x02,0x20,0x00,0x06,0x24,0x00,
0x04,0x23,0x00,0x04,0x21,0x80,0x08,0x20,
0xC0,0x10,0x20,0xC0,0x10,0x20,0x40,0x20,
0x20,0x40,0x00,0x20,0x00,0x00,0x20,0x00,
0x00,0x20,0x00,0x01,0xE0,0x00,0x00,0x40,
0x00,0x00,0x00,0x00
}; /* "小" */
const unsigned char xin[] PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x03,
0x30,0x00,0x03,0x10,0x00,0x03,0x00,0x00,
0x03,0x01,0x00,0x13,0x00,0x80,0x13,0x00,
0xC0,0x13,0x02,0x60,0x33,0x02,0x40,0x23,
0x02,0x00,0x03,0x02,0x00,0x03,0x03,0x00,
0x01,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00
}; /* "心" */
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// 定义 OLED 屏幕宽度和高度
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// 定义汉字的字号大小
const int FONT_WIDTH = 20; // 汉字宽度
const int FONT_HEIGHT = 20; // 汉字高度
// 初始化 OLED 显示器
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// 定义引脚常量
const int waterSensorPin = A0;
// 定义常量 waterSensorPin 为模拟输入引脚 A0,用于连接水位传感器。
const int ledPin = LED_BUILTIN;
// 定义常量 ledPin 为内置 LED 的引脚,通常在不同的 Arduino 板上有特定的定义。
const int outputPin = 5;
// 定义常量 outputPin 为数字输出引脚 5,可用于其他输出信号。
const int servoPin = 6;
// 定义常量 servoPin 为数字引脚 6,用于连接舵机。
const int greenLedPin = 10;
// 定义常量 greenLedPin 为数字引脚 10,用于控制绿灯。
const int yellowLedPin = 9;
// 定义常量 yellowLedPin 为数字引脚 9,用于控制黄灯。
const int redLedPin = 8;
// 定义常量 redLedPin 为数字引脚 8,用于控制红灯。
// 复位程序函数
void resetProgram() {
digitalWrite(ledPin, LOW);
// 将内置 LED 引脚设置为低电平,关闭 LED。
digitalWrite(outputPin, LOW);
// 将输出引脚设置为低电平。
digitalWrite(greenLedPin, HIGH);
// 点亮绿灯。
digitalWrite(yellowLedPin, LOW);
// 关闭黄灯。
digitalWrite(redLedPin, LOW);
// 关闭红灯。
}
// 读取水位传感器值函数
int readWaterSensorValue() {
int sensorValue = 0;
delay(100);
// 增加稳定时间,让传感器有足够时间稳定。
for (int i = 0; i < 5; i++) {
sensorValue += analogRead(waterSensorPin);
// 多次读取水位传感器的值并累加。
delay(10);
}
return sensorValue / 5;
// 取多次读取的平均值作为最终的传感器值。
}
// 控制 LED 和舵机函数
void controlLedsAndServo(int sensorValue) {
if (sensorValue < 0 || sensorValue > 1023 ) {
resetProgram();
// 如果水位检测值为乱码(超出合理范围)或者舵机没有角度值,复位程序。
} else if (sensorValue > 300) {
digitalWrite(ledPin, HIGH);
// 将内置 LED 引脚设置为高电平,使 LED 点亮。
delay(500);
digitalWrite(ledPin, LOW);
// 延迟 500 毫秒后将内置 LED 引脚设置为低电平,使 LED 熄灭。
delay(500);
digitalWrite(outputPin, HIGH);
// 将输出引脚设置为高电平。
digitalWrite(greenLedPin, LOW);
// 关闭绿灯。
digitalWrite(yellowLedPin, LOW);
// 关闭黄灯。
digitalWrite(redLedPin, HIGH);
// 点亮红灯。
display.clearDisplay(); // 清屏
// 在屏幕上显示汉字
display.drawBitmap(30, 20, jin, FONT_WIDTH, FONT_HEIGHT, SSD1306_WHITE);
display.drawBitmap(48, 20, zhi, FONT_WIDTH, FONT_HEIGHT, SSD1306_WHITE);
display.drawBitmap(66, 20, tong, FONT_WIDTH, FONT_HEIGHT, SSD1306_WHITE);
display.drawBitmap(84, 20, xing, FONT_WIDTH, FONT_HEIGHT, SSD1306_WHITE);
// 更新显示器显示
display.display();
} else if (sensorValue > 150) {
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
delay(500);
digitalWrite(greenLedPin, LOW);
// 关闭绿灯。
digitalWrite(yellowLedPin, HIGH);
// 点亮黄灯。
digitalWrite(redLedPin, LOW);
// 关闭红灯。
display.clearDisplay(); // 清屏
// 在屏幕上显示汉字
display.drawBitmap(30, 20, xiao, FONT_WIDTH, FONT_HEIGHT, SSD1306_WHITE);
display.drawBitmap(48, 20, xin, FONT_WIDTH, FONT_HEIGHT, SSD1306_WHITE);
display.drawBitmap(66, 20, tong, FONT_WIDTH, FONT_HEIGHT, SSD1306_WHITE);
display.drawBitmap(84, 20, xing, FONT_WIDTH, FONT_HEIGHT, SSD1306_WHITE);
// 更新显示器显示
display.display();
} else {
digitalWrite(ledPin, LOW);
// 将内置 LED 引脚设置为低电平,使 LED 熄灭。
digitalWrite(greenLedPin, HIGH);
// 点亮绿灯。
digitalWrite(yellowLedPin, LOW);
// 关闭黄灯。
digitalWrite(redLedPin, LOW);
// 关闭红灯。
if (sensorValue < 50) {
digitalWrite(outputPin, LOW);
// 当水位降到 50 时,引脚 5 设置为低电平。
}
display.clearDisplay(); // 清屏
// 在屏幕上显示汉字
display.drawBitmap(30, 20, an, FONT_WIDTH, FONT_HEIGHT, SSD1306_WHITE);
display.drawBitmap(48, 20, quan, FONT_WIDTH, FONT_HEIGHT, SSD1306_WHITE);
display.drawBitmap(66, 20, tong, FONT_WIDTH, FONT_HEIGHT, SSD1306_WHITE);
display.drawBitmap(84, 20, xing, FONT_WIDTH, FONT_HEIGHT, SSD1306_WHITE);
// 更新显示器显示
display.display();
}
}
void setup() {
pinMode(waterSensorPin, INPUT);
// 将水位传感器引脚设置为输入模式,以便读取传感器的模拟信号。
pinMode(ledPin, OUTPUT);
// 将内置 LED 引脚设置为输出模式,以便控制 LED 的亮灭。
pinMode(outputPin, OUTPUT);
// 将输出引脚设置为输出模式,用于输出特定信号。
pinMode(servoPin, OUTPUT);
// 将舵机控制引脚设置为输出模式。
pinMode(greenLedPin, OUTPUT);
// 将绿灯控制引脚设置为输出模式。
pinMode(yellowLedPin, OUTPUT);
// 将黄灯控制引脚设置为输出模式。
pinMode(redLedPin, OUTPUT);
// 将红灯控制引脚设置为输出模式。
// 初始化 OLED 显示器
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;)
;
}
// 清空显示器缓存
display.clearDisplay();
// 设置显示颜色
display.setTextColor(SSD1306_WHITE);
}
void loop() {
int sensorValue = readWaterSensorValue();
// 调用函数读取水位传感器的值。
controlLedsAndServo(sensorValue);
// 根据读取到的水位传感器值控制 LED 和舵机。
}