Запустили программу. Ничего не происходит (тикает внутренний таймер).
Нажали кнопку.
Через секунду удержания кнопки нужно выдать “Программа запущена: 5 сек (если не сразу нажали, а спустя 5 сек), кнопка нажата, секунд: 1”.
Через две секунды удержания нужно выдать “Программа запущена: 6 сек, кнопка нажата, секунд: 2”.
Делитель 1000 мне нужно потом увеличить до 1 минуты (60000), но тестировать буду на секундах.
Отпустили кнопку - программа закончена и ждет нажатия кнопки.
Нажали кнопку - пошел новый отсчет от нуля, сколько секунд зажата кнопка.
В идеале вместо сообщения в порт сразу ближе к реальности быть - на одной секунде вместо сообщения в порт один раз еле заметно мигнуть встроенным диодом Nano (для теста пойдет HIGH, delay 50, LOW, delay 50(но delay - это зло, поэтому лучше без него, но без него я не знаю, как реализовать)), на второй секунде зажатой кнопки два раза, на третьей - три и так бесконечно до отпускания кнопки.
Пытался по урокам Alexgyver делать - не судьба, т.к. он использует свою же библиотеку для работы с кнопкой, а мне такой вариант не подходит - мне нужно потом в Attiny13 этот скетч прописать, а там и библиотека не подгружается, да и вообще объем памяти скетча всего 1кБ, так что не разбежишься.
Так что от всех этих millis(); голова уже пухнет!
Светодиодами-то без delay я научился управлять, нет проблем, но тут задача-то другая.
Попробую ответить…
Наверно надо засечь время, когда кнопку только нажали - и потом выводить в консоль разницу между моментом нажатия кнопки и текущим временем…
Ну, можно и так. Только не раскрыта тема насчёт “засечь время”? Это как? По NTP запросить? Или юзеру мигнуть, чтобы глянул на часы и ввёл в мониторе порта. В общем, тут есть ещё над чем поработать.
Да если б всё так просто было пробовал раз 100.
Вот, например, один из вариантов, жутко кривой, но у меня иначе и не может быть.
К тому же не работает.
bool pressed = false;
int pressed_seconds = 0;
void setup() {
Serial.begin(9600);
pinMode(10, INPUT);
}
bool flag = false;
uint32_t btnTimer = 0;
void loop() {
bool btnState = !digitalRead(10);
if (btnState && !flag && millis() - btnTimer > 100) {
flag = true;
btnTimer = millis();
if (!digitalRead(10) == 1 && !pressed) {
pressed = true;
pressed = false;
}
if (millis() - last_time > 1000 && !pressed) { // 5 сек = 5000
last_time = millis();
pressed_seconds = pressed_seconds + 1;
Serial.print("Кнопка нажата ");
Serial.print(pressed_seconds); // Перевод из мсек в секунды.
//Serial.print((millis() - last_time)); // Перевод из мсек в секунды.
Serial.println(" сек.");
Serial.print("millis = "); Serial.print(millis()); Serial.print(", ");
Serial.print("last_time = "); Serial.print(last_time); Serial.print(", ");
Serial.print("pressed_seconds = "); Serial.print(pressed_seconds); Serial.print(", ");
Serial.print("btnTimer = "); Serial.print(btnTimer); Serial.print("\n");
bool btnState = !digitalRead(10);
if (!digitalRead(10) > 100) { // Кнопка нажата?
//Serial.print("Кнопка нажата. \n");
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(500); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(500);
}
}
}
if (!btnState && flag && millis() - btnTimer > 100) {
flag = false;
btnTimer = millis();
last_time = 0;
btnTimer = 0;
pressed_seconds = 0;
}
}```
Выдает всегда
Кнопка нажата 1 сек.
millis = 4189, last_time = 4188, pressed_seconds = 1, btnTimer = 4188
Кнопка нажата 1 сек.
millis = 5427, last_time = 5426, pressed_seconds = 1, btnTimer = 5426
Кнопка нажата 1 сек.
millis = 8439, last_time = 8439, pressed_seconds = 1, btnTimer = 8439
Кнопка нажата 1 сек.
millis = 10155, last_time = 10153, pressed_seconds = 1, btnTimer = 10153
Время разное - это я пытался сохранить первое время, когда только чтоб была нажата кнопка, но все эти переменные перезаписываются один хрен и все одно и то же обозначают (+ - 1-2 миллисекунды - это мелочи).
Я там чуть выше так и делал, засекал время, когда кнопку нажал, но, видимо, это время потом в перезаписалось миллион раз? Поэтому это время всё равно неверное и не отражает секунд зажатой кнопки.
Вы неправильно пишете код: в коде обязательно должны быть комментарии.
В общем случае комментарии должны отвечать на вопрос, зачем программа делает те или иные действия. В Вашем случае они будут нести дополнительную функцию: каждый из тех, кто будет читать Ваш код, сможет понять, совпадает ли то, что Вы делаете в коде с тем, что Вы пишете в комментариях, и таким образом найти ошибки в коде.
В любом случае рекомендую начинать с подробной записи алгоритма на русском. И только тогда, когда с этим алгоритмом будет полная ясность, переходить к переводу алгоритма на Си.
Да пох на ТЗ, ответ на заголовок темы. Функционал времени с начала программы добавляется выводом миллис.
Во втором while можно крутить блинк без делея и каждую секунду выводить сообщение.
Будет выдавать при каждом нажатии на кнопку.
Если эту строку убрать, то при приличном дребезге программа может пролететь первый while повторно на дребезге и выдать дополнительное совсем непотребное значение.