2 кнопки - одно устройство - проблема.
- Войдите на сайт для отправки комментариев
Ср, 25/03/2020 - 01:45
ДрУги приветствую! Зашел в тупик и бьюсь головой уже 2е сутки, не могу понять причину бага.
Есть некое устройство, подымаемое через серву посредством драйвера. Устройство поднимается и стоит в таком положении, пока есть сигнал на входе одного пина и опускается, когда сигнал пропадает. Или устройство поднимается по однократному нажатию на другую кнопку и опускается по нажатию на нее же.
Вот код, прошу прощения за сумбур, это уже энная итерация...:
#include <EEPROM.h> // подключаем библиотеку EEPROM #define PWMA 11 // выходы arduino #define AIN1 5 #define AIN2 6 #define STBY 12 #define DATCH 9 #define BUTT 8 int t_open = 1280; int t_close=800; int flag =2; int last_b=0; int motorSpeed = 255; // скорость мотора void setup() { Serial.begin(9600); pinMode(PWMA, OUTPUT); pinMode(AIN1, OUTPUT); pinMode(AIN2, OUTPUT); pinMode(STBY, OUTPUT); pinMode(DATCH, INPUT_PULLUP); pinMode(BUTT, INPUT_PULLUP); delay (100); } void loop() { if (digitalRead(DATCH) == LOW && digitalRead(BUTT)== HIGH && flag == 2) { // питание появилось, кнопка не нажата, закрыто - открываем delay(200); f_open(); flag = 1; // открыто delay(200); last_b=0; // обнуляем кнопку } if (digitalRead(DATCH) == HIGH && digitalRead(BUTT)== HIGH && flag == 1 && last_b==0) // для выключния питания { // питание пропало, кнопка не нажималась на открытие, открыто - закрываем delay(3000); f_close(); flag=2; // закрыто delay(200); } if (digitalRead(DATCH) == HIGH && digitalRead(BUTT)== LOW && flag == 2) { // питания нет, кнопка нажата, закрыто - открываем delay(200); f_open(); flag=1; // открыто last_b=1;// кнопку нажимали на открытие delay(200); } if (digitalRead(DATCH) == HIGH && digitalRead(BUTT)== LOW && flag == 1) { // питания нет, кнопка нажата, открыто - закрываем delay(200); f_close(); flag=2; // закрыто delay(200); } } void f_close() { digitalWrite(STBY, 1); digitalWrite(AIN1, 0); digitalWrite(AIN2, 1); analogWrite(PWMA, motorSpeed); delay(t_close); digitalWrite(STBY, 0); } void f_open() { digitalWrite(STBY, 1); digitalWrite(AIN1, 1); digitalWrite(AIN2, 0); analogWrite(PWMA, motorSpeed); delay(t_open); analogWrite(PWMA, motorSpeed-80); delay (300); digitalWrite(STBY, 0); }
Тут где-то ошибка, код не работает как надо. В данном случае не закрывается при пропадании сигнала. Взгляд в конец замылился, не могу найти ошибку...
нормальные пасаны так кнопки не читают, и уж тем более delay такой большой не пользуют. титановый вел Клапы в помощь
Так замените операции с сервой на включение светодиода - код сократится втрое, легко найдёте проблему в логике, исправите, потом вернёте сервовые дела.
Тут где-то ошибка, код не работает как надо.
да как же он будет работать, если например, в случае "питание пропало" в процессе закрывания напихано делаев аж на 5 секунд. И все это время вы ни кнопки не контролируете, ни питание...
Первым делом перепишите весь код без задержек. Если проблема не исчезнет - тогда отлаживайте так, как написали выше.
Дело в том, что устройство - это автомобильный навигатор, который выдвигается сервой из нишы. Задержки нужны для того, что бы на экране прошли нужные изменения/сообщения.
На делеях свет клином не сошелся, блинк без делей, делает тоже самое, но не блокирует работу МК.