-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGenSoilMonitoring.ino
181 lines (156 loc) · 10.3 KB
/
GenSoilMonitoring.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
// Автор: geniusz (geniuszly) | Eldar Turakulov
// Система мониторинга влажности почвы с использованием OLED дисплея, светодиода и зуммера для оповещения
#include <Adafruit_SSD1306.h> // Подключение библиотеки для работы с OLED дисплеем
#include <EEPROM.h> // Подключение библиотеки для работы с EEPROM
// Определение пинов
#define SENSOR_POWER_PIN 7 // Пин для питания датчика
#define SENSOR_READ_PIN 8 // Пин для считывания данных с датчика
#define LED_PIN 13 // Пин для подключения светодиода
#define BUZZER_PIN 9 // Пин для подключения зуммера
// Параметры OLED дисплея
#define SCREEN_WIDTH 128 // Ширина экрана
#define SCREEN_HEIGHT 64 // Высота экрана
#define OLED_RESET -1 // Пин сброса OLED дисплея (не используется)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // Инициализация дисплея
// Константы
const unsigned long SENSOR_READ_INTERVAL = 1000; // Интервал считывания данных, 1 секунда
const int SENSOR_ACTIVE = HIGH; // Включение датчика
const int SENSOR_INACTIVE = LOW; // Отключение датчика
const int MOISTURE_THRESHOLD = 500; // Критический уровень влажности
#define EEPROM_ADDRESS 0 // Адрес ячейки памяти EEPROM, где будут храниться данные калибровки
// Функция для инициализации системы
void initializeSystem() {
EEPROM.begin(512); // Инициализация EEPROM с 512 байтами
pinMode(SENSOR_POWER_PIN, OUTPUT); // Установка пина для питания датчика
powerSensorOff(); // Изначально датчик выключен
Serial.begin(9600); // Начало работы с последовательной передачей данных
initializeDisplay(); // Инициализация OLED дисплея
initializeAlertSystem(); // Инициализация системы оповещения (светодиод и зуммер)
// Чтение калибровочных данных из EEPROM
int storedCalibrationValue = readCalibrationData();
if (storedCalibrationValue == 255) {
Serial.println("Данные калибровки не найдены. Пожалуйста, выполните калибровку.");
calibrateSensor(); // Если данных нет, запускаем калибровку
} else {
Serial.println("Калибровочные данные успешно загружены.");
}
}
// Функция для включения датчика
void powerSensorOn() {
digitalWrite(SENSOR_POWER_PIN, SENSOR_ACTIVE); // Включение питания датчика
}
// Функция для выключения датчика
void powerSensorOff() {
digitalWrite(SENSOR_POWER_PIN, SENSOR_INACTIVE); // Отключение питания датчика
}
// Функция для получения данных с датчика
int getSensorReading() {
int sum = 0;
const int numReadings = 5; // Количество измерений для усреднения данных
for (int i = 0; i < numReadings; i++) {
sum += digitalRead(SENSOR_READ_PIN); // Считывание данных с датчика
delay(10); // Задержка для стабилизации сигнала
}
return (sum / numReadings); // Возврат усредненного значения
}
// Функция для инициализации OLED дисплея
void initializeDisplay() {
if (!display.begin(SSD1306_I2C_ADDRESS, 0x3C)) { // Проверка, что дисплей инициализирован
Serial.println("Ошибка инициализации OLED!"); // Вывод сообщения об ошибке
return;
}
display.clearDisplay(); // Очистка экрана
display.display(); // Обновление дисплея
}
// Функция для отображения значений датчика на экране OLED
void displaySensorValue(int sensorValue) {
display.clearDisplay(); // Очистка экрана
display.setTextSize(1); // Установка размера текста
display.setTextColor(WHITE); // Установка цвета текста
display.setCursor(0, 0); // Установка позиции курсора
display.print("Влажность почвы: "); // Вывод текста
display.println(sensorValue); // Вывод значения с датчика
display.display(); // Обновление дисплея
}
// Функция для включения светодиода и зуммера при низком уровне влажности
void triggerAlert() {
digitalWrite(LED_PIN, HIGH); // Включение светодиода
tone(BUZZER_PIN, 1000); // Включение зуммера на частоте 1000 Гц
}
// Функция для отключения светодиода и зуммера
void disableAlert() {
digitalWrite(LED_PIN, LOW); // Выключение светодиода
noTone(BUZZER_PIN); // Отключение зуммера
}
// Функция для проверки критического уровня влажности и оповещения
void checkCriticalMoisture(int sensorValue) {
if (sensorValue < MOISTURE_THRESHOLD) { // Проверка на критическое значение влажности
Serial.println("Внимание: низкая влажность почвы!");
triggerAlert(); // Включение оповещения
} else {
disableAlert(); // Отключение оповещения, если влажность в норме
}
}
// Функция для обработки данных с датчика
void processSensorData() {
int sensorValue = getSensorReading(); // Получение данных с датчика
printSensorOutput(sensorValue); // Вывод значений датчика в консоль
displaySensorValue(sensorValue); // Отображение значений на экране OLED
checkCriticalMoisture(sensorValue); // Проверка на критическое значение влажности
if (sensorValue) {
powerSensorOn(); // Включение питания датчика, если уровень влажности в норме
} else {
powerSensorOff(); // Отключение питания датчика
}
}
// Функция для вывода данных с датчика в консоль
void printSensorOutput(int sensorValue) {
Serial.print("Значение датчика: ");
Serial.println(sensorValue); // Вывод значения в последовательный порт
Serial.println();
}
// Функция для калибровки датчика
void calibrateSensor() {
Serial.println("Калибровка датчика...");
int calibrationValue = analogRead(SENSOR_READ_PIN); // Считывание текущих данных для калибровки
Serial.print("Значение калибровки: ");
Serial.println(calibrationValue);
// Сохранение калибровочного значения в EEPROM
saveCalibrationData(calibrationValue);
}
// Функция для сохранения калибровочных данных в EEPROM
void saveCalibrationData(int calibrationValue) {
EEPROM.write(EEPROM_ADDRESS, calibrationValue); // Запись данных в EEPROM по указанному адресу
EEPROM.commit(); // Подтверждение записи данных
Serial.println("Данные калибровки сохранены.");
}
// Функция для чтения калибровочных данных из EEPROM
int readCalibrationData() {
int storedCalibrationValue = EEPROM.read(EEPROM_ADDRESS); // Чтение данных из EEPROM
Serial.print("Прочитанные данные калибровки: ");
Serial.println(storedCalibrationValue);
return storedCalibrationValue;
}
// Функция для инициализации пинов для светодиода и зуммера
void initializeAlertSystem() {
pinMode(LED_PIN, OUTPUT); // Установка пина светодиода как выход
pinMode(BUZZER_PIN, OUTPUT); // Установка пина зуммера как выход
digitalWrite(LED_PIN, LOW); // Изначально светодиод выключен
digitalWrite(BUZZER_PIN, LOW);// Изначально зуммер выключен
}
// Главная функция цикла
void mainLoop() {
static unsigned long lastReadTime = 0; // Переменная для хранения времени последнего измерения
if (millis() - lastReadTime >= SENSOR_READ_INTERVAL) { // Проверка интервала считывания
lastReadTime = millis(); // Обновление времени последнего измерения
processSensorData(); // Обработка данных с датчика
}
}
// Функция для инициализации системы
void setup() {
initializeSystem(); // Инициализация системы
}
// Главная функция
void loop() {
mainLoop(); // Вызов основной функции цикла
}