Запуск сторонней функции в loop(), нужна помощь.
- Войдите на сайт для отправки комментариев
Вс, 10/01/2016 - 20:28
Здравствуйте, помогите пожалуйста разобраться с кодом. Коротко о проекте: сбор показаний с датчиков с интервалом в 2с, и плюс решил на борту шим регулятор одной кнопкой замутить. Раздельно эти функции выполняются на ура, а вот вместе из-за delay, обработка кнопки тормозит...пробовал проводить измерения сторонней функцией, а шим оставить в loop, но ничего не вышло...я так и не понял как вызвать функцию которая ничего не возвращает в loop. Может сделать вывод в серийный монитор из результатов измериний в loop, а сторонняя функция будет проводить измерения и передавать результаты в loop?
#include "DHT.h" #define DHTPIN 2 #define DHTTYPE DHT11 int vlagaPin = 3; int vlagaVal = 0; int switchPin = 8; int ledPin = 11; boolean lastButton = LOW; boolean currentButton = LOW; int ledLevel = 0; DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); pinMode(switchPin, INPUT); pinMode(ledPin, OUTPUT); } boolean debounce(boolean last) { boolean current = digitalRead(switchPin); if (last != current) { delay(5); current = digitalRead(switchPin); } return current; } void loop() { currentButton = debounce(lastButton); if (lastButton == LOW && currentButton == HIGH) { ledLevel = ledLevel + 51; } lastButton = currentButton; if (ledLevel > 255) ledLevel = 0; analogWrite(ledPin, ledLevel); //__________________________________ float h = dht.readHumidity(); float t = dht.readTemperature(); vlagaVal = analogRead(vlagaPin); Serial.print("Humidity: "); Serial.print(h); Serial.println(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C "); Serial.print("Vlagnost' "); Serial.println(vlagaVal); delay(2000); } /* void measurement() { float h = dht.readHumidity(); float t = dht.readTemperature(); vlagaVal = analogRead(vlagaPin); Serial.print("Humidity: "); Serial.print(h); Serial.println(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C "); Serial.print("Vlagnost' "); Serial.println(vlagaVal); delay(2000); }*/
https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
Со светодиодом еще понятно, у него есть 2 состояния которые можно отследить и посчитать millis(), а как быть с задержкой после измерения 2х датчиков?
не используй delay !!!
примерно так (пока недописано, но думаю принцеп понятен):
delay нужно выкинуть. Просто вход в ту часть кода, где происходит измерение датчиков нужно делать раз в 2 сек., вот так например:
Со светодиодом еще понятно, у него есть 2 состояния которые можно отследить и посчитать millis()
Вы неправильно поняли пример. Для того, чтобы посчитать millis не нужно отслеживать состояние светодиода. Состояние в том примере отслеживается только для того, чтобы его инвертировать (если горит, то потушить; если не горит, то зажечь). С millis это не связано. Для подсчета millis нужно не состояние, а событие. В Вашем случае событием будет чтение с датчика.
Как мне отслеживать и каждый раз перезапускать чтение с датчика dht например?
P/s Спасибо, действительно, можно разбить программу на временные отрезки с помощью if...else/ сейчас попробую
Получилось довольно таки просто. Теперь кнопка не тормозит и данные корректно приходят в серийный порт.