Мне всё равно на каком языке читать: русском или английском. А примеры - так они общие примеры, они показывают идею используемых техник, а под конкретную среду надо писать самому. Но идеи там здравые. Не единственно возможные, но здравые. И совет уходить от популярных частот помех тоже правильный.
и как дописать защиту от дребезга, не применяя delay
Вы, ЕвгенийП, видимо легко читаете англицкий....
Вторая причина - примеры софтверного подавления дребезга явно не дуиновские...
Может для многих тут это все и не проблема.... ... но не для меня.
Мне всё равно на каком языке читать: русском или английском. А примеры - так они общие примеры, они показывают идею используемых техник, а под конкретную среду надо писать самому. Но идеи там здравые. Не единственно возможные, но здравые. И совет уходить от популярных частот помех тоже правильный.
Проблему дребезга я пока отложил в сторону (видимо решу ее хардверно).
Написал алгоритм долива воды, но как-то коряво выглядит.
Не поможете оптимизировать?
#define WATER_COUNTER 2 #define WATER_VALWE 4 #define WATER_BANK 22 #define WATER_SAMP_IN_HI 24 #define WATER_SAMP_OUT_HI 26 #define WATER_SAMP_OUT_NORM 28 #define WATER_SAMP_OUT_LOW 30 int waterCounter = 0; byte waterLine = 0; byte waterCountState = 0; byte lastWaterCountState = 0; long int seconds; //... void setup() { //... pinMode(WATER_COUNTER, INPUT_PULLUP); pinMode(WATER_BANK, INPUT_PULLUP); pinMode(WATER_SAMP_IN_HI, INPUT_PULLUP); pinMode(WATER_SAMP_OUT_HI, INPUT_PULLUP); pinMode(WATER_SAMP_OUT_NORM, INPUT_PULLUP); pinMode(WATER_SAMP_OUT_LOW, INPUT_PULLUP); pinMode(WATER_VALWE, OUTPUT); Serial.begin(9600); } void loop() //... { waterLine = min(digitalRead(WATER_BANK),digitalRead(WATER_SAMP_IN_HI)); //проверяем уровни воды { if (seconds >= 36000 && seconds <= 36060 && waterLine >= 1) { // условие старта долива воды в 10:00 + ограничение долива одной минутой + по уровням норма digitalWrite(WATER_COUNTER, HIGH); // открыть клапан waterCountState = digitalRead(WATER_COUNTER); // if (waterCountState != lastWaterCountState) { if (waterCountState == HIGH) { waterCounter++; // считать литры delay(100); Serial.println("doliv vodu"); Serial.print("litrov "); Serial.println(waterCounter); } } lastWaterCountState = waterCountState; if (waterCounter >= 10) { digitalWrite(WATER_VALWE, LOW); } if(seconds <= 36120) waterCounter = 0; } } }Немного подправил.
Ни как не получается перевести подсчет литров воды в прерывания (ну или как правильно говорится)
#define WATER_COUNTER 2 #define WATER_VALWE 4 #define WATER_BANK 22 #define WATER_SAMP_IN_HI 24 #define WATER_SAMP_OUT_HI 26 #define WATER_SAMP_OUT_NORM 28 #define WATER_SAMP_OUT_LOW 30 byte waterCounter = 0; byte waterLine = 0; byte waterCountState = 0; byte lastWaterCountState = 0; long int seconds; //... void setup() { //... pinMode(WATER_COUNTER, INPUT_PULLUP); pinMode(WATER_BANK, INPUT_PULLUP); pinMode(WATER_SAMP_IN_HI, INPUT_PULLUP); pinMode(WATER_SAMP_OUT_HI, INPUT_PULLUP); pinMode(WATER_SAMP_OUT_NORM, INPUT_PULLUP); pinMode(WATER_SAMP_OUT_LOW, INPUT_PULLUP); pinMode(WATER_VALWE, OUTPUT); Serial.begin(9600); } //... void loop() //... { waterLine = min(digitalRead(WATER_BANK),digitalRead(WATER_SAMP_IN_HI))*digitalRead(WATER_SAMP_OUT_HI); //проверяем уровни воды if (seconds >= 36000 && seconds <= 36060 && waterLine >= 1) { // условие старта долива воды (в 10:00 + ограничение долива 1 мин + по уровням норма) digitalWrite(WATER_COUNTER, HIGH); // открыть клапан waterCountState = digitalRead(WATER_COUNTER); // следим за счетчиком if (waterCountState != lastWaterCountState && waterCountState == HIGH) { waterCounter++; // считать литры delay(10); // Serial.println("doliv vodu"); // Serial.print("litrov "); // Serial.println(waterCounter); } lastWaterCountState = waterCountState; if (waterCounter >= 10 || seconds || 36060 || waterLine < 1 ) // если отсчитали 10 литров или прошла минута или переполнение воды digitalWrite(WATER_VALWE, LOW); // закрыть клапан } if(seconds <= 36120) waterCounter = 0; // сбросить счетчик воды }Может хоть кто-то, кому не сложно поможет?