Всем доброго времени суток. Решил я сделать "умную" электронную сигарету на arduino. Концепция заключается в кнопочном управлении мощностью посредством ШИМ, наличии экрана, и некоторыми защитами в виде ограничения максимального времени нажатия и уход камня в сон (режим пониженного энергопотребления) после N секунд простоя.
Вводные: по нажатию кнопки запускается ШИМ и управляет полевиком, но в целях защиты я хочу ограничить время выполнения кода до 7 секунд(что бы при случайном зажатии кнопки в кармане не получить травматическую ампутацию конечностей)
Проблема пришла откуда не ждали - обработка нажатой основной кнопки срабатывает как попало. Нажимая кнопку обработчик может сработать сразу и отработает как по маслу, а может и через 5 нажатий не сработать вовсе. Проверял в живую на Arduino UNO, Pro Mini (328е Меги) и в Proteus'е. Симптомы одни и те же. Проблема очевидно в коде но я в упор не вижу в чем может быть загвоздка. Уровень у меня "штота умею" поэтому не судите строго.
#define pwmPin 5
#define buttonStart 3
#define maxOnTime 7000 //максимальное время выполнения условия нажатой кнопки
#define RED_LED 7
#define GREEN_LED 8
int power = 150;
//boolean StartState;
boolean StartStateFlag; //Флаг кнопки Старт
unsigned long pressTime;
void setup() {
pinMode(pwmPin, OUTPUT);
pinMode(buttonStart, INPUT);
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
Serial.begin(9600); //чисто для отладки
}
void loop() {
if (digitalRead(buttonStart) && StartStateFlag && ((millis() - pressTime) <= maxOnTime)) { // (1) если кнопка старт нажата И была отпущена И нажата менее 7 секунд выполняем:
analogWrite(pwmPin, power); //запуск ШИМ
Serial.println("PWM_ON");
digitalWrite(GREEN_LED, HIGH);
digitalWrite(RED_LED, LOW);
} else { // (2) иначе
StartStateFlag = false; // кнопка небыла отпущена
analogWrite(pwmPin, 0);
digitalWrite(GREEN_LED, LOW);
Serial.println("PWM_OFF");
pressTime = millis();
}
if (!digitalRead(buttonStart)) { //(3) если кнопка не нажата
analogWrite(pwmPin, 0); //остановка ШИМ
Serial.println("PWM_OFF");
digitalWrite(RED_LED, HIGH);
StartStateFlag = true; //была отпущена и можно входить в условие с нажатой кнопкой (1)
}
}
И файлы: сам скетч, .elf и .hex для шПротеуса и проект Протеус.
P. S. ШИМ в Протеусе не работает в принципе, в железе все ОК
BUTTON_TEST.ino
BUTTON_TEST.ino.eightanaloginputs.hex
BUTTON_TEST.ino.elf
BUTTON_TEST.ino.with_bootloader.eightanaloginputs.hex
ButtonTest.pdsprj