Оптимальное и экономичное управление водяным насосом
Я использую микроконтроллер Arduino, водяной насос 12 В и реле печати для полива растений.
Переключатель уровня воды контролирует резервуар для воды, чтобы убедиться, что водяной насос не пересыхает.
Я попробовал различное время полива и понял, что при использовании более длительного времени полива 90 000 миллисекунд и дольше. Реле иногда переключается неправильно, и насосы продолжают работать. Я не уверен, что мой код оптимален для таких целей:
const int Power_Water = 3; // Pin to turn the Pump On and Off via relay
const int Watering_Time = 90000; // Time the water's supposed to run
const int Water_Tank = 10; // Water Level Switch
void setup() {
Serial.begin(9600);
pinMode(Power_Water,OUTPUT); // Pin that triggers the Relay as Output
pinMode (Water_Tank,INPUT_PULLUP); // Pin of Water_Level Sensor as internal pullup
}
void loop (){
unsigned long watering_Start = millis();
while (millis() - watering_Start <= Watering_Time && (digitalRead (Water_Tank) == LOW)){
digitalWrite(Power_Water,HIGH); // Water Pump goes ON
Serial.println(millis() - watering_Start);
}
if (millis() - watering_Start > Watering_Time || (digitalRead (Water_Tank) == HIGH)){
Serial.println("Pump OFF");
digitalWrite(Power_Water,LOW);// Water Pump OFF
}
delay(100000000); // example "sleep" time the system is not supposed to water
}
Любые предложения приветствуются.
Я изменился
const int Power_Water = 3; // Pin to turn the Pump On and Off via relay
const long Watering_Time = 90000; // Time the water's supposed to run
const long Water_Tank = 10; // Water Level Switch
void setup() {
Serial.begin(9600);
pinMode(Power_Water,OUTPUT); // Pin that triggers the Relay as Output
pinMode (Water_Tank,INPUT_PULLUP); // Pin of Water_Level Sensor as internal pullup
}
void loop (){
unsigned long watering_Start = millis();
digitalWrite(Power_Water,HIGH);
while (digitalRead(Power_Water) == HIGH){
Serial.println(millis() - watering_Start);
if (millis() - watering_Start > Watering_Time || (digitalRead (Water_Tank) == HIGH)){
Serial.println("Pump OFF");
digitalWrite(Power_Water,LOW);
}
}
delay(100000000); // example "sleep" time the system is not supposed to water
}
@Peter S, 👍0
Обсуждение1 ответ
Это заявление о задержке полностью противоречит целям вашего кода millis. Если вы хотите обеспечить минимальное свободное время, вам придется сделать это и с миллисом. Использование millis таким образом требует, чтобы вы позволяли функции цикла повторяться много тысяч раз в секунду. Как написано, вы разрешаете выполнять функцию цикла только один раз в одиннадцать с половиной дней.
спасибо за ввод... вот пример, и здесь я хочу, чтобы код повторялся каждые 100000000 мс, но когда насос запускается, я хочу контролировать его с помощью millis.. часть полива-это важная часть для меня.. Я думаю, что нашел правильный код для своих нужд и добавил его к своему вопросу, @Peter S
Правильный код для вас не будет иметь никакого использования функции задержки. Использование функции задержки нарушает ваше использование millis. Использование millis требует, чтобы цикл был свободен для запуска. Вы не можете использовать блокирующие вызовы, такие как delay, в то же время вы используете millis для синхронизации и ожидаете, что что-то получится., @Delta_G
- Ошибка при попытке динамического моделирования температуры
- Как остановить реле после его включения и дать датчику получить результат
- Как заставить 5-вольтовое реле работать с NodeMCU
- Когда следует использовать транзистор, МОП-транзистор, а когда следует использовать реле?
- Причины, по которым нельзя подключать реле непосредственно к цифровому контакту Arduino
- Esp8266 Vin контакт
- Правильный PIN для активации беспроводного реле с ESP8266 ESP-01
- Мигните светодиодом 5 раз с помощью цикла for
вы определили watering_time как целое число .... прочтите это ... https://www.arduino.cc/reference/en/language/variables/data-types/int/ ........ тогда прочтите это ... https://www.arduino.cc/reference/en/language/variables/data-types/long/, @jsotola
используйте unsigned long Watering_Time. максимальное значение для signed int-32 767, @Juraj