Как сделать так, чтобы водяной насос включался и выключался в зависимости от уровня влажности?
Я пытаюсь построить автоматическую систему полива растений с помощью моего Arduino. У меня есть ЖК-дисплей, который выводит уровень влажности, датчик влажности и водяной насос с реле. Я пытаюсь заставить водяной насос считывать данные о влажности, и если они показывают ниже 60, включить насос на 10 секунд, а затем выключить насос, пока он снова не снимет показания влажности, чтобы проверить, нужно ли ему больше воды. Однако я не могу заставить свой водяной насос выключиться. Он не считывает данные датчика влажности?
String writeAPIKey = "dCFFuwutXLRoHKQNqbIXrP"; //Вставьте здесь свой ключ API ThingSpeak Write.
unsigned int interval = 60000; //Обновлять каждую минуту
long int now=0, previous=-50000; //Используется для хранения переменных времени.
#define DST_IP "maker.ifttt.com" //Сервер Thingspeak
//ЖК-дисплей
//Загрузить библиотеки
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
//Определяем адрес для последовательного ЖК-дисплея.
#define I2C_ADDR 0x27 //Если 0x3f не работает, измените это на 0x27
#define BACKLIGHT_PIN 3
//Инициализируем последовательный ЖК-дисплей.
LiquidCrystal_I2C lcd(I2C_ADDR, 2,1,0,4,5,6,7); //Эти номера выводов жестко закодированы на плате последовательного порта.
// Датчик влажности
int moistureSensor = A3; // датчик влажности подключен к A3 на arduino
int data; // Используется для хранения данных пользователя
int waitTime = 1000;
// водяной насос
int pumpPin = 8; // водяной насос
int waterTime = 10; // время полива 10 секунд
void setup() { // поместите сюда код настройки для однократного запуска:
// Датчик влажности
Serial.begin(9600);
// ЖК-дисплей
lcd.begin (16,2); //Инициализируем ЖК-дисплей.
lcd.setBacklightPin(3,POSITIVE);//Настраиваем подсветку.
lcd.setBacklight(HIGH); //Включаем подсветку.
lcd.clear();
lcd.setCursor(0,0); //перейти к первому столбцу и первой строке (0,0)
lcd.print("Hello - Arnold"); //Печать в месте расположения курсора
lcd.setCursor(5,1); //перейти к первому столбцу и второй строке
delay(1000);
// насос
pinMode(pumpPin, OUTPUT);
// Wi-Fi
Serial.begin(9600); // Открыть последовательное соединение с компьютером
Serial1.begin(115200); // Открыть последовательное соединение с ESP8266
Serial.println("IFTTT Maker");
Serial1.println("AT+RST"); //Выдать команду сброса
Serial.println("AT+RST");
delay(1000);
// ЦИКЛ ОТЛАДКИ - отображение вывода ESP на последовательный монитор.
while (Serial1.available()) {
Serial.println(Serial1.read());
}
Serial.println("AT+CWMODE=1");
Serial1.println("AT+CWMODE=1"); //Установить режим одного клиента.
delay(5000);
Serial.println("AT+CIFSR");
Serial1.println("AT+CIFSR"); //Отображение информации IP
// ЦИКЛ ОТЛАДКИ - отображение вывода ESP на последовательный монитор.
while (Serial1.available()) {
Serial.println(Serial1.read());
}
delay(1000);
Serial.println("AT+CIPMUX=0");
Serial1.println("AT+CIPMUX=0"); //Настраивает режим одиночного соединения.
delay(1000);
// ЦИКЛ ОТЛАДКИ - отображение вывода ESP на последовательный монитор.
while (Serial1.available()) {
Serial.write(Serial1.read());
}
delay(1000);
}
void loop() { // поместите сюда основной код для многократного выполнения:
// Влага
delay(waitTime);
data = analogRead(moistureSensor);
data = map(data, 0, 1023, 0, 100);
Serial.println(data);
// ЖК-дисплей
for(int count = 0; count < 15; count++) {
lcd.clear();
lcd.setCursor(7,0);
lcd.print(data);
delay(500);
}
// насосПин
if (moistureSensor <= 60) {
digitalWrite(pumpPin, HIGH);
delay(waterTime*1000); // включено на 10 секунд
digitalWrite(pumpPin, LOW);
delay(waitTime);
} else if (moistureSensor >=65) {
digitalWrite(pumpPin, LOW);
delay(waitTime);
}
// ИФТТТ
now=millis(); //Получаем текущее время.
//Проверяем, не пора ли бежать.
if(now - previous >= interval){
previous = now;
Serial.println("Running Update");
updateThingSpeak();
}
}
void updateThingSpeak(){
int moisture = analogRead(moistureSensor); //Считываем влажность
//Создает строку подключения для ESP8266
String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += DST_IP;
cmd += "\",80";
Serial1.println(cmd); //Выполнить команду
Serial.println(cmd); //Вывести это в окно отладки
delay(1000);
// ЦИКЛ ОТЛАДКИ - отображение вывода ESP на последовательный монитор.
while (Serial1.available()) {
Serial.write(Serial1.read());
}
//МНЕ НУЖНО ОБНОВИТЬ ЭТОТ ОПЕРАТОР IF, ЧТОБЫ УБЕДИТЬСЯ, ЧТО СОЕДИНЕНИЕ РАБОТАЕТ
//если (клиент.подключиться(thingSpeakAddress, 80)){
String httpcmd="GET/trigger/arnold_the_plant/with/key/dCFFuwutXLRoHKQNqbIXrP?";
httpcmd += "value1=";
httpcmd += moisture;
httpcmd += " HTTP/1.1\r\n";
httpcmd += "Host: maker.ifttt.com\n";
httpcmd += "Connection: close\r\n\r\n";
Serial.print("AT+CIPSEND=");
Serial.println(httpcmd.length());
Serial1.print("AT+CIPSEND=");
Serial1.println(httpcmd.length());
delay(1000);
Serial.print(">");
Serial1.println(httpcmd);
Serial.println(httpcmd);
delay(3000);
// ЦИКЛ ОТЛАДКИ - отображение вывода ESP на последовательный монитор.
while (Serial1.available()) {
Serial.write(Serial1.read());
}
Serial.println("AT+CIPCLOSE");
Serial1.println("AT+CIPCLOSE"); //Закрыть веб-соединение
} // конец пустого цикла
@Bethany Belbin, 👍1
Обсуждение1 ответ
Инвертируйте логический уровень на выводе, управляющем водяным насосом.
// pumpPin
if (moistureSensor <= 60)
{ digitalWrite(pumpPin, LOW );
delay(waterTime*1000);
// включено на 10 секунд
digitalWrite(pumpPin, HIGH);
delay(waitTime); }
else if (moistureSensor >=65)
{ digitalWrite(pumpPin, HIGH);
delay(waitTime); }
Извините, я совсем новичок в этом. Что вы имеете в виду?, @Bethany Belbin
В «условии если» говорится, что всякий раз, когда ваш датчик влажности обнаруживает некоторый желаемый уровень, это означает уровень, при котором вы выключаете водяной насос, а затем ждете 10 секунд, как написано, а затем снова включаете водяной насос., @Hasan
А в случае «иначе, если условие» ваш датчик влажности обнаруживает некоторое значение, превышающее некоторый другой требуемый уровень, то ваш электронасос всегда включен., @Hasan
Короче говоря, здесь мы устанавливаем два желаемых уровня, то есть 60
и 65
. Всякий раз, когда ваш датчик влажности обнаруживает значение, которое меньше или равно 60
, ваш двигатель насоса останавливается и работает 10 секунд, а затем двигатель насоса запускается. А если ваш датчик влажности обнаруживает значение, которое больше 65
, ваш двигатель насоса всегда включен., @Hasan
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- устаревшее преобразование из строковой константы в 'char*'
Из-за моего полного отсутствия опыта использования Arduino я могу ошибаться, и это возможно из-за странностей их библиотек, но если предположить, что ваш MoistureSensor выводит напряжение, а определение A3 — это своего рода перечисление контактов, разве вы не должны считывать с помощью AnalogRead(moistureSensor)? Для моих уставших глаз это выглядит так, будто вы просто сравниваете 60 и 65 с фиксированным значением «A3». Редактировать:: На самом деле, вы сравниваете контакт, в то же время считывая его в переменную влажности. Опечатка, я полагаю?, @Asmyldof
Возможно, это не имеет отношения к вашему вопросу, но в
httpcmd
вам нужен пробел после "GET" и\r
после "maker.ifttt.com"., @Edgar Bonet