Как сделать так, чтобы водяной насос включался и выключался в зависимости от уровня влажности?

Я пытаюсь построить автоматическую систему полива растений с помощью моего 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"); //Закрыть веб-соединение


   } // конец пустого цикла

, 👍1

Обсуждение

Из-за моего полного отсутствия опыта использования Arduino я могу ошибаться, и это возможно из-за странностей их библиотек, но если предположить, что ваш MoistureSensor выводит напряжение, а определение A3 — это своего рода перечисление контактов, разве вы не должны считывать с помощью AnalogRead(moistureSensor)? Для моих уставших глаз это выглядит так, будто вы просто сравниваете 60 и 65 с фиксированным значением «A3». Редактировать:: На самом деле, вы сравниваете контакт, в то же время считывая его в переменную влажности. Опечатка, я полагаю?, @Asmyldof

Возможно, это не имеет отношения к вашему вопросу, но в httpcmd вам нужен пробел после "GET" и \r после "maker.ifttt.com"., @Edgar Bonet


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