Почему не корректно работает задержка ?
- Войдите на сайт для отправки комментариев
Вс, 04/10/2020 - 11:08
пробую использовать millis для запуска двух не связанных кусочков кода, но работает то через раз то вообще фиг пойми как)) подскажите где косяк?
#define rele_dom 9 // пин реле в доме
#define rele_ul 6 // пин реле на улице
#define dsveta 7 // пин датчика света
#define ddvij 2 // датчик движения
#define gerkon 5 // геркон
#define knopka 3 // кнопка
// test
// Variables will change:
long previousMillis = 0; // храним время последнего переключения светодиода
long previousMillis2 = 0;
bool one = false;
// /test
void setup() {
Serial.begin(9600);
pinMode(rele_dom, OUTPUT);
pinMode(rele_ul, OUTPUT);
digitalWrite(rele_dom, HIGH); // выключаем реле по умолчанию
digitalWrite(rele_ul, HIGH);
pinMode(dsveta, INPUT);
pinMode(gerkon, INPUT);
pinMode(knopka, INPUT);
}
void loop()
{
Serial.println(digitalRead(dsveta));
// здесь будет код, который будет работать постоянно
// и который не должен останавливаться на время между переключениями свето
unsigned long currentMillis = millis();
if (digitalRead(dsveta) == 1) {
digitalWrite(rele_dom, LOW);
} else {
if (currentMillis - previousMillis > 30000) { // время в милисекундах
previousMillis = currentMillis;
digitalWrite(rele_dom, HIGH);
}
}
if (digitalRead(dsveta) == 1) {
digitalWrite(rele_ul, LOW);
} else {
if (currentMillis - previousMillis2 > 4000) { // время в милисекундах
previousMillis2 = currentMillis;
digitalWrite(rele_ul, HIGH);
}
}
}
написанное фиг пойми как, именно так и работает.
Замените
На
Замените
На
здесь это как мёртвому припарки.
Наверно счетчики отключения нужно стартовать в момент включения, и завершать после этого, а не крутить вне зависимости от ничего.
на самом деле не такая простая задача )))
проверь, может это то, что и требовалось?
в железе не проверял, но скомпилировалось
#define rele_dom 9 // пин реле в доме #define rele_ul 6 // пин реле на улице #define dsveta 7 // пин датчика света #define ddvij 2 // датчик движения #define gerkon 5 // геркон #define knopka 3 // кнопка // test // Variables will change: long previousMillis = 0; // храним время последнего переключения светодиода long previousMillis2 = 0; bool one = false; byte flag_ul = 0; byte flag_dom = 0; // test void setup() { Serial.begin(9600); pinMode(rele_dom, OUTPUT); pinMode(rele_ul, OUTPUT); digitalWrite(rele_dom, HIGH); // выключаем реле по умолчанию digitalWrite(rele_ul, HIGH); pinMode(dsveta, INPUT); pinMode(gerkon, INPUT); pinMode(knopka, INPUT); } void loop() { Serial.println(digitalRead(dsveta)); // здесь будет код, который будет работать постоянно // и который не должен останавливаться на время между переключениями свето unsigned long currentMillis = millis(); if(flag_dom && flag_ul && digitalRead(dsveta)){ // светало ))) flag_dom = 0; flag_ul = 0;} if (digitalRead(dsveta) == 1) { digitalWrite(rele_dom, LOW); digitalWrite(rele_ul, LOW); // если светло всё выключено } else { // вечерело if(!digitalRead(rele_dom) && !flag_dom){ // свет в доме был выключен digitalWrite(rele_dom, HIGH); // включили свет previousMillis = currentMillis;// запомнили во сколько включили }else{ // свет включен, не порали выключать if (currentMillis - previousMillis >= 30000) { // время в милисекундах digitalWrite(rele_dom, LOW); // пора - выключаем flag_dom = 1; } } if(!digitalRead(rele_ul)&& !flag_ul){ digitalWrite(rele_ul, HIGH); previousMillis2 = currentMillis; }else{ if (currentMillis - previousMillis2 > 4000) { // время в милисекундах digitalWrite(rele_ul, LOW); flag_ul = 1; } } } }экстрасексы набежали ...
экстрасексы набежали ...
это Знахари анализ мочи на вкус делают, а мы экстрасенсы общаемся только с Хрустальным шаром )))