Задача: сделать таймер полива без привязки к реальному времени определяющий время суток. Подошла бы полная копия такого устройства. Интервалы времени нужны меньше от 10сек. до часа примерно. В зависимости от времени день или ночь – его определяет фото датчик, время работы насоса и время паузы между работой насоса регулируется отдельно 4-мя разными ручками, 2-мя справа (дневной режим) и 2-мя слева (ночной режим). Казалось бы простейший проект ,но не пойму с чего начать. Конечно же не прошу написать скетч за меня) Просто хотелось бы понять как строить структуру скетча и каким образом считать время.Как понимаю обычный delay не подойдет.. Очень желательно чтобы в фоне могли выполняться другие действия. Всем заранее спасибо)
Подскажите пожалуйста как такой скетч изменить, чтобы можно было отдельно задать время свечения и отдельно время паузы. Код (C): const int ledPin = 13; // номер выхода, подключенного к светодиоду // Variables will change: int ledState = LOW; // этой переменной устанавливаем состояние светодиода long previousMillis = 0; // храним время последнего переключения светодиода long interval = 1000; // интервал между включение/выключением светодиода (1 секунда) void setup() { // задаем режим выхода для порта, подключенного к светодиоду pinMode(ledPin, OUTPUT); } void loop() { // здесь будет код, который будет работать постоянно // и который не должен останавливаться на время между переключениями свето unsigned long currentMillis = millis(); //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis > interval) { // сохраняем время последнего переключения previousMillis = currentMillis; // если светодиод не горит, то зажигаем, и наоборот if (ledState == LOW) ledState = HIGH; else ledState = LOW; // устанавливаем состояния выхода, чтобы включить или выключить светодиод digitalWrite(ledPin, ledState); }
Код (C): const int ledPin = 13; // номер выхода, подключенного к светодиоду // Variables will change: int ledState = LOW; // этой переменной устанавливаем состояние светодиода long previousMillis = 0; // храним время последнего переключения светодиода long pauseTime = 10; // Время паузы в секундах long lightTime = 100; // Время свечения в секундах long interval = 1000; // интервал между включение/выключением светодиода (1 секунда) void setup() { // задаем режим выхода для порта, подключенного к светодиоду pinMode(ledPin, OUTPUT); } void loop() { // здесь будет код, который будет работать постоянно // и который не должен останавливаться на время между переключениями свето unsigned long currentMillis = millis(); //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis > pauseTime * 1000 && ledState == LOW) { // сохраняем время последнего переключения previousMillis = currentMillis; ledState = HIGH; // устанавливаем состояния выхода, чтобы включить или выключить светодиод digitalWrite(ledPin, ledState); } //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis > lightTime * 1000 && ledState == HIGH) { // сохраняем время последнего переключения previousMillis = currentMillis; ledState = LOW; // устанавливаем состояния выхода, чтобы включить или выключить светодиод digitalWrite(ledPin, ledState); } }
Всё заработало! Спасибо за помощь. хотелось бы только усовершенствовать строчки: Код (C): if (fotorezval<500) //ночь и Код (C): if (fotorezval>500) //день чтобы if срабатывало через циклов 100 например , чтобы исключить ложные переключения. то есть, если fotorezval будет сто раз подряд меньше 500 тогда перейти к ночной части кода. Код (C): #define FOTO_REZ A0// фото резистор #define VAR_REZ1 A1 // регулятор паузы ночью #define VAR_REZ2 A2 // регулятор полива ноью #define VAR_REZ3 A3 // регулятор паузы днем #define VAR_REZ4 A4 // регулятор полива днем const int ledPin = 13; // номер выхода, подключенного к светодиоду // Variables will change: int ledState = LOW; // этой переменной устанавливаем состояние светодиода long previousMillis = 0; // храним время последнего переключения светодиода long interval = 1000; // интервал между включение/выключением светодиода (1 секунда) void setup() { // задаем режим выхода для порта, подключенного к светодиоду pinMode(ledPin, OUTPUT); Serial.begin(9600); } void loop() { delay(1000); int fotorezval = analogRead(FOTO_REZ); Serial.print("fotorezval..."); Serial.println(fotorezval); if (fotorezval<500) //ночь { int pause = analogRead(VAR_REZ1); int watering = analogRead(VAR_REZ2); long pauseTime = pause; // Время паузы в секундах long lightTime = watering; // Время свечения в секундах Serial.print("PAUSE NIGHT---"); Serial.println(pause); Serial.print("WATERING NIGHT---"); Serial.println(watering); // здесь будет код, который будет работать постоянно // и который не должен останавливаться на время между переключениями свето unsigned long currentMillis = millis(); //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis > pauseTime * 1000 && ledState == LOW) { // сохраняем время последнего переключения previousMillis = currentMillis; ledState = HIGH; // устанавливаем состояния выхода, чтобы включить или выключить светодиод digitalWrite(ledPin, ledState); } //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis > lightTime * 1000 && ledState == HIGH) { // сохраняем время последнего переключения previousMillis = currentMillis; ledState = LOW; // устанавливаем состояния выхода, чтобы включить или выключить светодиод digitalWrite(ledPin, ledState); } } if (fotorezval>500) //день { int pause1 = analogRead(VAR_REZ3); int watering1 = analogRead(VAR_REZ4); long pauseTime1 = pause1; // Время паузы в секундах long lightTime1 = watering1; // Время свечения в секундах Serial.print("PAUSE DAY---"); Serial.println(pause1); Serial.print("WATERING DAY---"); Serial.println(watering1); // здесь будет код, который будет работать постоянно // и который не должен останавливаться на время между переключениями свето unsigned long currentMillis = millis(); //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis > pauseTime1 * 1000 && ledState == LOW) { // сохраняем время последнего переключения previousMillis = currentMillis; ledState = HIGH; // устанавливаем состояния выхода, чтобы включить или выключить светодиод digitalWrite(ledPin, ledState); } //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis > lightTime1 * 1000 && ledState == HIGH) { // сохраняем время последнего переключения previousMillis = currentMillis; ledState = LOW; // устанавливаем состояния выхода, чтобы включить или выключить светодиод digitalWrite(ledPin, ledState); } } }