Обратный отсчет при запуске условия
- Войдите на сайт для отправки комментариев
Чт, 03/09/2015 - 23:01
Помогите с вставкой таймера отсчета.
Считать нужно от заданной time которая будет зависить от введенных пользователем данных
/*---------------------РАБОТА РАБОТЫ ПРОГРАММЫ---------------------*/
else if (numberMenu == 3) {
if (NProg1 = 0, NProg2 = 0, NProg3 = 0, NProg4 = 0) {
time = 1440;
do {
if (millis() - prMillis > delayTime) {
prMillis = millis();
time--;
digitalWrite(13, HIGH); // включаем
delay(200);
digitalWrite(13, LOW); // выключаем
display.setCursor(10, 15);
display.setTextSize(2);
display.print(((delayTime) / 1000) / 60);
display.display();
}
} while (time != 0);
}
if (!digitalRead(keyUndo) && !digitalRead(keyUp)) { // Если нажата кнопка возврата вернутся в предидущее меню.
numberMenu = 1;
noTone(12);
delay(300);
}
}
Тут я уже пытался сделалть что-то вроде таймера но он не отоброжается на дисплее...
Вот полный код программы.
// Подключаем необходимые библиотеки
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
/*---------------------ПЕРЕМЕННЫЕ ВЫВОДОВ-------------------------------------*/
#define keyDown 5 // кнопки
#define keySelect 6
#define keyUp 7
#define keyUndo 8
#define buzz 11
#define led1 12
#define led2 13
/*---------------------ПЕРЕМЕННЫЕ ДЛЯ МЕНЮ-------------------------------------*/
unsigned int MenuPos = 0; // переменная курсора меню
unsigned int numberMenu = 0; // Переменная для хранения экранов меню.
uint16_t vbat = 0; // Переменная для хранения заряда батарейки
unsigned int NProg1 = 0; // переменная выбора программы #1
unsigned int NProg2 = 0;
unsigned int NProg3 = 0;
unsigned int NProg4 = 0;
unsigned int Prog = 0; // Переменная запуска программы.
/*---------------------ПЕРЕМЕННЫЕ ТАЙМЕРА(ВОЗМОЖНО ВРЕМЕННО)------------------*/
unsigned int time;
int t;
int s;
int m;
byte programm; // Номер команды
unsigned long previousMillis = 0; // Предыдущее значение millis
const long interval = 1000; // Интервал в мс.
unsigned long beginCountMillis = 0; // Сохраняем начальное значение Millis для отсчета от него.
/*---------------------НАСТРАИВАЕМ I/O------------------*/
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Инициализация дисплея.
pinMode(keyUp, INPUT_PULLUP); // Верхняя правая кнопка
pinMode(keyDown, INPUT_PULLUP); // Нижняя правая
pinMode(keyUndo, INPUT_PULLUP); // Верхняя левая
pinMode(keySelect, INPUT_PULLUP); // Нижняя левая
pinMode(buzz, OUTPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
display.clearDisplay();
display.setTextColor(WHITE);
}
void loop() {
unsigned long prMillis = 0;
unsigned int delayTime = 1000;
NProg1 = constrain(NProg1, 0, 9);
NProg2 = constrain(NProg2, 0, 9);
NProg3 = constrain(NProg3, 0, 9);
NProg4 = constrain(NProg4, 0, 9);
analogReference(EXTERNAL);
vbat = analogRead(0);
display.clearDisplay();
display.setTextColor(WHITE);
/*--------------------------БАТАРЕЙКА--------------------------*/
display.drawRect (2, 0, 15, 7, 1); // тело батарейки
if (vbat >= 820) { // 100%
display.fillRect (3, 1, 14, 6, 1); // индикатор
}
else if (vbat >= 720) {// 75%
display.fillRect (3, 1, 10, 6, 1); // индикатор
}
else if (vbat >= 676) {// 50%
display.fillRect (3, 1, 7, 6, 1); // индикатор
}
else if (vbat >= 614) {// 25%
display.fillRect (3, 1, 4, 6, 1); // индикатор
}
else if (vbat >= 512) {// 0%
display.fillRect (3, 1, 1, 6, 1); // индикатор
}
display.fillRect (17, 1, 2, 5, 1); // кончик батарейки
display.setCursor(20, 0); // Тут выведенна информация
display.setTextSize(1); // о состоянии батарейки
display.print(vbat); // нужна для отладки
display.drawLine (0, 9, 128, 9, 1); // линия разделения.
/*-------------------------ГЛАВНОЕ МЕНЮ-------------------------*/
if (numberMenu == 0) {
display.setCursor(10, 15);
display.setTextSize(2);
display.print("Программы");
display.setCursor(10, 40);
display.setTextSize(2);
display.print("Настройки");
if (!digitalRead(keyDown)) {
MenuPos++;
delay(300);
}
else if (!digitalRead(keyUp)) {
MenuPos--;
delay(300);
}
///// рисуем и устанавливаем курсор согласно позиции.
if (MenuPos == 0) {
display.drawRect (7, 12, 113, 20, 1);
display.drawRect (6, 11, 115, 22, 1);
if (!digitalRead(keySelect)) { // Если нажата кнопка выбора перелючить в следующее меню
delay(300);
numberMenu = 1;
}
}
else if (MenuPos == 1) {
display.drawRect (7, 37, 113, 20, 1);
display.drawRect (6, 36, 115, 22, 1);
}
else if (MenuPos >= 2) MenuPos = 0; // если курсор опущен ниже второго пункта вернуть в начало.
}
/*-------------------------МЕНЮ ПРОГРАММ-------------------------*/
else if (numberMenu == 1) {
display.setCursor(10, 15);
display.setTextSize(2);
display.print("Встроеные");
display.setCursor(10, 40);
display.setTextSize(2);
display.print("С карты >");
if (!digitalRead(keyDown)) {
MenuPos++;
delay(300);
}
else if (!digitalRead(keyUp)) {
MenuPos--;
delay(300);
}
///// рисуем и устанавливаем курсор согласно позиции.
if (MenuPos == 0) {
display.drawRect (7, 12, 113, 20, 1);
display.drawRect (6, 11, 115, 22, 1);
if (!digitalRead(keySelect)) { // Если нажата кнопка выбора перелючить в следующее меню
delay(300);
numberMenu = 2;
}
}
else if (MenuPos == 1) {
display.drawRect (7, 37, 113, 20, 1);
display.drawRect (6, 36, 115, 22, 1);
}
else if (MenuPos >= 2) MenuPos = 0; // если курсор опущен ниже второго пункта вернуть в начало.
if (!digitalRead(keyUndo)) { // Если нажата кнопка возврата вернутся в предидущее меню.
delay(300);
numberMenu = 0;
}
}
/*--------------------МЕНЮ ПРОГРАММ ИЗ ПАМЯТИ--------------------*/
else if (numberMenu == 2) {
display.setCursor(10, 15);
display.setTextSize(2);
display.print("Введите #");
display.setCursor(10, 40);
display.print(">>");
display.setCursor(40, 40);
display.print(NProg1);
display.setCursor(60, 40);
display.print(NProg2);
display.setCursor(80, 40);
display.print(NProg3);
display.setCursor(100, 40);
display.print(NProg4);
if (!digitalRead(keySelect)) {
MenuPos++;
delay(300);
}
else if (!digitalRead(keyUndo)) {
MenuPos--;
delay(300);
}
///// рисуем и устанавливаем курсор согласно позиции.
if (MenuPos == 0) {
display.drawRect (38, 38, 14, 18, 1);
display.drawRect (37, 37, 16, 20, 1);
if (!digitalRead(keyUp)) {
NProg1++;
delay(300);
}
else if (!digitalRead(keyDown)) {
NProg1--;
delay(300);
}
}
else if (MenuPos == 1) {
display.drawRect (58, 38, 14, 18, 1);
display.drawRect (57, 37, 16, 20, 1);
if (!digitalRead(keyUp)) {
NProg2++;
delay(300);
}
else if (!digitalRead(keyDown)) {
NProg2--;
delay(300);
}
}
else if (MenuPos == 2) {
display.drawRect (78, 38, 14, 18, 1);
display.drawRect (77, 37, 16, 20, 1);
if (!digitalRead(keyUp)) {
NProg3++;
delay(300);
}
else if (!digitalRead(keyDown)) {
NProg3--;
delay(300);
}
}
else if (MenuPos == 3) {
display.drawRect (98, 38, 14, 18, 1);
display.drawRect (97, 37, 16, 20, 1);
if (!digitalRead(keyUp)) {
NProg4++;
delay(300);
}
else if (!digitalRead(keyDown)) {
NProg4--;
delay(300);
}
}
else if (MenuPos == 4) {
numberMenu = 3;
delay(300);
}
}
/*---------------------РАБОТА РАБОТЫ ПРОГРАММЫ---------------------*/
else if (numberMenu == 3) {
if (NProg1 = 0, NProg2 = 0, NProg3 = 0, NProg4 = 0) {
time = 1440;
do {
if (millis() - prMillis > delayTime) {
prMillis = millis();
time--;
digitalWrite(13, HIGH); // включаем
delay(200);
digitalWrite(13, LOW); // выключаем
display.setCursor(10, 15);
display.setTextSize(2);
display.print(((delayTime) / 1000) / 60);
display.display();
}
} while (time != 0);
}
if (!digitalRead(keyUndo) && !digitalRead(keyUp)) { // Если нажата кнопка возврата вернутся в предидущее меню.
numberMenu = 1;
noTone(12);
delay(300);
}
}
/*---------------------МЕНЮ ПРОГРАММ С КАРТЫ---------------------*/
display.display();
Очень нужна помощь... уже всю голову сломал... Зарание благадарю.
Суть в том что мне надо из заданного time получить число вида 24:00 и вывести его на дисплей с обратным отсчетом.
в том варианте что я выложил не выводится на дисплей вообще ничего...
if (NProg1 = 0, NProg2 = 0, NProg3 = 0, NProg4 = 0) { programm = 1; beginCountMillis = 0; } if (programm == 1) // { // Текущее значение millis unsigned long currentMillis = millis(); // Из текущего вычитаем предыдущее и проверяем больше или равно интервалу. if (currentMillis - previousMillis >= interval) { // Присваиваем предыдущему значению текущее. previousMillis = currentMillis; // Ваш код. time = 1440000; // Если начальное значение равно 0. if (beginCountMillis == 0) { // Задаем начальное значение счетчика. beginCountMillis = previousMillis; } // Прибавляем начальное значение и time. time += beginCountMillis; byte s = ((time - previousMillis) / 1000ul) % 60; byte m = (((time - previousMillis) / 1000ul) / 60ul) % 60; if (s > 0 || m > 0) { Serial.print(m); Serial.print(":"); Serial.print(s); Serial.print("\n"); //digitalWrite(8, HIGH); display.clearDisplay(); display.setCursor(5, 0); display.setTextSize(2); display.setTextColor(WHITE); display.print("Antistress"); display.setCursor(20, 20); display.setTextSize(3); display.print(m); display.setCursor(50, 15); display.setTextSize(5); display.print(":"); display.setCursor(70, 20); display.setTextSize(3); display.println(s); display.display(); } else { Serial.println("Finish"); display.clearDisplay(); display.setCursor(10, 20); display.setTextSize(3); display.print("Finish"); display.display(); delay(10000); programm = 0; } } }Пытался сделать еще подобный вариант но при нем мерцает раз в секунду надписи но обратный отсчет не идет...
вот я делал на семисегментном дисплее , можеш взять как образец
https://www.youtube.com/watch?v=APHAS2nvHLw
там и скетч есть
Что по-Вашему означает глубокомысленная конструкция:
if (NProg1 = 0, NProg2 = 0, NProg3 = 0, NProg4 = 0) {На мой глупый взгляд она эквивалентна
if (0) {и, стабо быть, код не выполняется никогда.
///Суть в том что мне надо из заданного time получить число вида 24:00 и вывести его на дисплей с обратным отсчетом. ///
В суть кода не вникал но по даному вопросу могу сказать следующее:
//Необходимо создать переменные для часа и минут или минуты секунды - в зависимости что считаем
int chas;
int minut;
time=1440;
chas = time/100;
minut = time % 100;
Получим формат вида chas = 14; minut=40
От minut -1, когда minut=0, - chas - 1; minut = 59
Примерно так
По мойму
if (NProg1 = 0, NProg2 = 0, NProg3 = 0, NProg4 = 0) {выполняет действие если все 4 переменных равны 0
а если:
if (NProg1 = 0, NProg2 = 0, NProg3 = 0, NProg4 = 1) {то выполняется другая команда и таким оброзом можно записать 9999 программ.
А записанно так чтобы понимать какой номер у программы. тем более что она эквивалентна.
По мойму
if (NProg1 = 0, NProg2 = 0, NProg3 = 0, NProg4 = 0) {выполняет действие если все 4 переменных равны 0
а если:
if (NProg1 = 0, NProg2 = 0, NProg3 = 0, NProg4 = 1) {то выполняется другая команда и таким оброзом можно записать 9999 программ.
А записанно так чтобы понимать какой номер у программы. тем более что она эквивалентна.
Почитайте про разницу между "=" - оператором присвоения и "==" - оператором сравнения.
и не пишите так
if(NProg1 = 0, NProg2 = 0, NProg3 = 0, NProg4 = 1)компилятор это проглотит....
а вот так
if( 0 = NProg1 , 0 = NProg2 , 0 = NProg3 , 1 = NProg4 )компилятор возмутится присваиванию константы другого значения
и придётся переделать в
if(NProg1 == 0, NProg2 == 0, NProg3 == 0, NProg4 == 1)Спасибо Kisoft !Почитайте про разницу между "=" - оператором присвоения и "==" - оператором сравнения.
По мойму
if (NProg1 = 0, NProg2 = 0, NProg3 = 0, NProg4 = 0) {выполняет действие если все 4 переменных равны 0
Вы глубоко ошибаетесь. Почитайте Кернигана и Ритчи или ещё что-нибудь.
Вражение:
означает: выполнить четыре операции присваивания слева направо, а в качестве результат взять результат последней операции (т.е. 0).
Ну тут признаю ошибку:
Исправил на :
Я прогромирование на дуне занимаюсь от силы месяц. Пока еще часто ошибаюсь. Знал бы больше не писал бы сюда. Но все равно спасибо.
Остался вопрос по таймеру. Разнос меню по разным void меня не прельщает так как не очень понимаю как ими управлять и как их грамотно вызывать.
Исправил на :
В таком виде это абсолютно идентично гораздо более короткой записи:
Вам это надо? Если нет, то пиште правильно.
Ну чтож спасибо за отсутсвие помощи. Видимо в мире Arduino как и в любом другом помогать с решением задачь умеют только посыланием. Спасибо за отсутсвие помощи.
А написать if((NProg1 == 0) && (NProg2 == 0) && (NProg3 == 0) && (NProg4 == 1) ) что не позволяет?
Это тупая, классическая запись. Если Вы только начали, забудьте про запятые. Посмотрите чужие исходники, думаю Вы не много увидите используемую Вами конструкцию. Вам уже намекнули и явно написали, однако в ответ только обиды. Как угодно.
Спасибо за отсутсвие помощи.
Я Вам показал в каком месте у Вас ошибка. Вы стали спорить, я Вам написал в чём суть ошибки (правда, Вы не прочитали). Затем Вы исправили (как Вам казалось), я посмотрел и снова показал в каком месте ошибка. Кроме того, я посоветовал Вам что именно нужно почитать.
И всё это Вы называете "отсутствие помощи"??? Вы, наглец, молодой человек!
Какой помощи Вы ожидаете? Вам пол помыть, минет сделать или за Вас всё написать? Первого и второго я не делаю, а третье - не вопрос, - двести баксов в час и я всё напишу.
Удачи!