Как написать скрипт, если датчик воды контактирует с водой более 2 минут и загорается светодиод

Я новичок в arduino и программировании. Я хотел бы выпустить код для датчика воды, чтобы обнаруживать наличие воды в течение более 2 минут, прежде чем загорится светодиодная лампочка. В настоящее время используется Arduino, базовый экран Grove с датчиком воды Grove http://wiki.seeedstudio.com/Grove-Water_Sensor/.

У меня есть простой базовый код, но я не знаю, как мне добавить функцию для обнаружения воды в течение более длительного периода времени, прежде чем загорится свет:

#define watersensor 8               //Датчик воды Grove к цифровому контакту 8 Arduino
#define led 4                      //Светодиод Grove на цифровой контакт 4

int isWater;
bool wasWater = false;
//bool isWater, wasWater = false; // истина => в настоящее время мы не видим воды
uint32_t waterstart_ms = 0;        // время, когда впервые увидели воду


void setup() {
  pinMode(watersensor, INPUT);    
  pinMode(led, OUTPUT);                   
}


void loop()
{
   // Есть ли вода?
 isWater = digitalRead(watersensor);     // считываем датчик
 Serial.println(isWater);

   if( isWater ){
      if( wasWater ) {
      waterstart_ms = millis();  // Первая вода: засекаем время
      }
        if( millis() - waterstart_ms >= 1*5*1000 ){// Вода продолжается 5 секунд (сначала пробная версия); время зажечь светодиод?
            digitalWrite(led, HIGH);
        }//конец, если
            wasWater = true;
   } // закончить первым, если
   else {
      wasWater = false; // Нет воды; светодиод выключен
      digitalWrite(led, LOW);
   }
}

, 👍1

Обсуждение

Это точно так же, как вы делаете это для звука — просто используя присутствие воды вместо максимального значения звука., @Majenko


1 ответ


1

Должен ли светодиод фиксироваться (горит постоянно после включения) или гаснуть, если позже датчик не обнаружит воды? Я предполагаю последнее. Вот (непроверенный) конечный автомат, который должен дать вам хорошее начало. Он отслеживает, была ли вода уже видна, когда она началась и видна ли она сейчас. Есть некоторое резервное переключение светодиода; удаление этого (при желании) «оставляется в качестве упражнения для читателя».

#define watersensor 8               //Датчик воды Grove к цифровому контакту 8 Arduino
#define led 4                      //Светодиод Grove на цифровой контакт 4

#define TWOMIN (2*60*1000L)

bool isWater, wasWater = false;    // истина => в настоящее время / видели воду
uint32_t WaterStart_ms = 0;        // время, когда впервые увидели воду


void setup() {
  pinMode(watersensor, INPUT_PULLUP);  // подтяжка для тестирования с кнопкой
  pinMode(led, OUTPUT);
}


void loop()
{
  // Есть ли вода?
  isWater = !digitalRead(watersensor);     // считываем датчик

  if ( isWater ) {
    if ( !wasWater ){
      // Первая вода: засекаем время
      WaterStart_ms = millis();
      wasWater = true;
    }
    else {
      // Вода продолжается; время зажечь светодиод?
      if ( (millis() - WaterStart_ms) >= TWOMIN )
        digitalWrite(led, HIGH);
    }
  }
  else {
    // Нет воды; светодиод выключен
    wasWater = false;
    digitalWrite(led, LOW);
  }
  delay(300);
}

Обновление:

Добавлено wasWater = true; в строке 27. delay(300) в строке 40 не требуется. Работал правильно, когда я тестировал его с помощью кнопки (тоже отрицательная логика) для датчика.

свет загорается случайным образом.

Посмотрите, дает ли ваш датчик правильные ответы (попробуйте распечатать его вывод в цикле() ). Если он колеблется вокруг переходов, вам может потребоваться дождаться некоторого количества показаний подряд, противоположных предыдущему состоянию датчика, прежде чем вы примете его новое состояние как реальное.

,

Привет Джей Роберт! Спасибо за ваше руководство. Я внес небольшие поправки в код. Но датчик загорается только без наличия воды. когда я меняю if (!wasWater) на if (wasWater), свет загорается случайным образом. Не уверен, где пошло не так.. Обновил новый измененный код в моем вопросе!, @hmppp