Обратный отсчет Arduino в рамках цикла задержки

133
16

Какой прекрасный опыт, мой первый проект Arduino оказывается... Теперь я хотел бы добавить обратный отсчет до тех пор, пока не будет отображено и отображено показание датчика, которое будет повторяться бесконечно. У меня датчик и ЖК-дисплей работают нормально, но мой цикл не совсем прав. Должен ли я использовать какое-то время()? Как сохранить таймер во время большой задержки между показаниями?

/*Code for self-watering plant with LCD readout*/
// value for LCD params
char ESC = 0xFE;
// analog input pin that the soil moisture sensor is attached to
const int analogInPin = A1;
// value read from the soil moisture sensor
int sensorValue = 0;
// if the readings from the soil sensor drop below this number, then turn on the pump
int dryValue;
// countdown timer until next soil reading
int timerValue = 9;

void setup() {
pinMode(12, OUTPUT);
// initialize serial communications at 9600 bps:
Serial.begin(9600);
// Set the "dry" value of soil on turning on the device
dryValue = analogRead(analogInPin);
// pause before intialize LCD
delay(2000);
// Initialize LCD module
Serial.write(ESC);
Serial.write(0x41);
Serial.write(ESC);
Serial.write(0x51);
// Set Contrast
Serial.write(ESC);
Serial.write(0x52);
Serial.write(40);
// Set Backlight
Serial.write(ESC);
Serial.write(0x53);
Serial.write(5);

//print the dry value to serial
Serial.print("Dry = " );
Serial.print(dryValue);
Serial.print(" ");
}

void loop(){
watering();
// wait some time (really should be delay(86400000))
delay(10000);
}

void printTimer(){
// Set cursor line 1, column 16
Serial.write(ESC);
Serial.write(0x45);
Serial.write(0x0F);
// print the timer value
Serial.print(timerValue);
timerValue = timerValue - 1;
if(timerValue == 0){
timerValue = 9;
}
}

void printVal(){
// set cursor line 2, column 1
Serial.write(ESC);
Serial.write(0x45);
Serial.write(0x40);
// print the sensor to the serial monitor:
Serial.print("Sensor = " );
Serial.print(sensorValue);
Serial.print(" ");
printTimer();
}

void watering(){
// read the analog in value:
sensorValue = analogRead(analogInPin);
//turn on the water pump for some time if the soil is too dry
if(sensorValue < dryValue){
digitalWrite(12, HIGH);
delay(2000);
digitalWrite(12, LOW);
}
else {
printVal();
}
}

спросил(а) 2021-01-25T16:05:34+03:00 4 месяца, 2 недели назад
1
Решение
77

Я бы использовал библиотеку таймеров для Arduino, как это http://playground.arduino.cc//Code/SimpleTimer

Просто загрузите библиотеку, поместите ее в папку "библиотеки" в своем альбоме и перезапустите свою среду разработки Arduino, чтобы загрузить новую библиотеку.

Тогда ваш код будет выглядеть примерно так. В основном, что он делает, он обновляет экран каждый цикл, а затем каждые 86400000 мс проверяет функцию "полива". Просто чтобы вы знали, что этот код будет проверять почву только каждые 24 часа (86400000 мс). Я думаю, что лучшим решением было бы постоянно проверять почву и воду в любое время, когда это необходимо. Но я не садовник, поэтому, возможно, есть причина просто проверять один раз в день.

 #include <SimpleTimer.h>

// the timer object
SimpleTimer timer;

void setup() {
Serial.begin(9600);
timer.setInterval(86400000, watering); // how often you would call your watering function is set with the first variable
}

void loop() {
timer.run();
printTimer();
}

void printTimer(){
// Set cursor line 1, column 16
Serial.write(ESC);
Serial.write(0x45);
Serial.write(0x0F);
// print the timer value
Serial.print(timerValue);
timerValue = timerValue - 1;
if(timerValue == 0){
timerValue = 9;
}
}

void printVal(){
// set cursor line 2, column 1
Serial.write(ESC);
Serial.write(0x45);
Serial.write(0x40);
// print the sensor to the serial monitor:
Serial.print("Sensor = " );
Serial.print(sensorValue);
Serial.print(" ");
printTimer();
}

void watering(){
// read the analog in value:
sensorValue = analogRead(analogInPin);
// send it to the display
printVal();
//turn on the water pump for some time if the soil is too dry
if(sensorValue < dryValue){
digitalWrite(12, HIGH);
delay(2000);
digitalWrite(12, LOW);
}
}

ответил(а) 2021-01-25T16:05:34+03:00 4 месяца, 2 недели назад
44

Это на самом деле очень просто: не откладывайте. Вместо этого инициализируйте таймер, чтобы запускать процедуру всякий раз, когда она переполняется или попадает в определенное значение. Изучите спецификацию для микроконтроллера, используемого в вашем Arduino для конкретных бит для frob (обратите внимание, что библиотеки Arduino используют вектор переполнения таймера 0 для себя), а документация avr-libc для обозначения ISR (ов) для таймера, Затем ваш loop() становится большим сном, пока таймер запускает все шоу для вас.

ответил(а) 2021-01-25T16:05:34+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема