Как написать скрипт, если датчик воды контактирует с водой более 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);
}
}
@hmppp, 👍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
- Как сохранить данные на SD-карту с помощью модуля защиты памяти SPI
- Как установить таймеры, используя миллисекунды на 3 датчиках PIR?
- Использовать Data Logger Shield с Arduino Sensor shield V5.0
- Какая типичная форма готового проекта Arduino?
- Как игнорировать датчик, срабатывающий в первый раз, и начать запись в миллисекундах при втором срабатывании
- Какова работа pulseIn?
- Сколько датчиков может поддерживать один модуль Arduino?
- Получение BPM из данного кода
Это точно так же, как вы делаете это для звука — просто используя присутствие воды вместо максимального значения звука., @Majenko