RTC (DS1307) с ARDUINO
- Войдите на сайт для отправки комментариев
Вс, 29/01/2012 - 18:00
#include <LiquidCrystal.h>
#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>
//Переменные для сохранения данных часов
int hr_00; //часы
int mn_00; //минуты
int sc_00; //секунды
int DD_00; //дни
int MM_00; //месяцы
int YY_00; //годы
char delitel = ':'; //разделитель времени для отображения
void setup()
{
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
lcd.begin(16,2);
lcd.clear();
delay(1);
}
void loop()
{
read_rtc1307();//прочитать время в переменные
rtc1307LCD(); //отобразить переменные времени на экран
delay(1);
}
void read_rtc1307()
{
hr_00=RTC.get(DS1307_HR,true);
mn_00=RTC.get(DS1307_MIN,false);
sc_00=RTC.get(DS1307_SEC,false);
DD_00=RTC.get(DS1307_DATE,false);
MM_00=RTC.get(DS1307_MTH,false);
YY_00=RTC.get(DS1307_YR,false);
}
void rtc1307LCD()
{
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
lcd.begin(16,2);
lcd.setCursor (0,0);
lcd.print (hr_00);
lcd.setCursor (2,0);
lcd.print (delitel);
lcd.setCursor (3,0);
lcd.print (mn_00);
lcd.setCursor (5,0);
lcd.print (delitel);
lcd.setCursor (6,0);
lcd.print (sc_00);
lcd.setCursor (0,1);
lcd.print (DD_00);
lcd.setCursor (2,1);
lcd.print ('-');
lcd.setCursor (3,1);
lcd.print (MM_00);
lcd.setCursor (4,1);
lcd.print ('-');
lcd.setCursor (5,1);
lcd.print (YY_00);
delay(1000);
lcd.clear();
}
Все работает, но проблема немогу придумать как сделать установку часов, минут и т.д с кнопок.
А еще каждую секунду экра поддергивается. Помогите пожалуйста, я начинающий.........................
void rtc1307LCD() {
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
lcd.begin(16,2);
lcd.setCursor (0,0);
[...]
delay(1000);
lcd.clear();
}
Расскажите, из каких соображений производится инициализация объекта lcd при каждом выводе на дисплей?
И зачем вы стираете выведенную информацию после секундной задержки?
А без иницилизации нечего и неработало.
производится инициализация объекта lcd при каждом выводе на дисплей?
подсказка - есть секция setup, у вас там уже все прописано. По поводу установок - нужно писать управляемую менюшку и "окно" ввода инфо. Пробуйте, учитесь, я тут где то выкладывал код для большой менюшки.
А не подскажете где можно увидеть это меню, ну я думал сделать меню на основе switch case...... ну что неполучилось.
Первый вариант но как то у меня криво заработало, вот и подумал что я нетак сделал............ Решил переделать......... #include <LiquidCrystal> #include <WProgram> #include <Wire> #include <DS1307> int swset = 12; Кнопка установки часов и подтверждения ввода int up = 11; Кнопка установки больше int down = 10; Кнопка установки меньше int x; //переменные int hoursave; int swsec000; int swmin000; int swhor000; int swday000; int swmon000; int swyer000; LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // пины LCD //Переменные для хранения и чтения с часов и затем выводом на экран int hr_00; int mn_00; int sc_00; int DD_00; int MM_00; int YY_00; //Переменные хранения для установки часов int hr_01=0; int mn_01=0; int sc_01=0; int DD_01=0; int MM_01=0; int YY_01=0; char delitel = ':'; void btn_read() // Запись состояния переключателя в переменые { swset = digitalRead (12); //Переключатель установки } void var2LCD() { lcd.clear(); //Очистка экрана //Координаты ; Текст lcd.setCursor (0,0); lcd.print (hr_00); lcd.setCursor (2,0); lcd.print (delitel); lcd.setCursor (3,0); lcd.print (mn_00); lcd.setCursor (5,0); lcd.print (delitel); lcd.setCursor (6,0); lcd.print (sc_00); lcd.setCursor (0,1); lcd.print (DD_00); lcd.setCursor (2,1); lcd.print ('-'); lcd.setCursor (3,1); lcd.print (MM_00); lcd.setCursor (5,1); lcd.print ('-'); lcd.setCursor (6,1); lcd.print (YY_00); } void RTC_red2var()//читаем с часов в переменные { hr_00=RTC.get(DS1307_HR,true); mn_00=RTC.get(DS1307_MIN,false); sc_00=RTC.get(DS1307_SEC,false); DD_00=RTC.get(DS1307_DATE,false); MM_00=RTC.get(DS1307_MTH,false); YY_00=RTC.get(DS1307_YR,false); } void RTC_set2var()//Установка часов { do { lcd.clear();//очищаем экран RTC.stop(); //останавливаем часы btn_read();//читаем переключатели в переменные switch (x) { case 1: if (! digitalRead (up) && digitalRead (down)) { if (hoursave > 59) hoursave ++; delay (200); } else if (digitalRead (up) && ! digitalRead (down)) { if (hoursave > 59) hoursave --; delay (200); } swsec000 = hoursave; lcd.setCursor (0,0); lcd.print ("Seconds"); lcd.setCursor (1,1); lcd.print (swsec000); RTC.set(DS1307_SEC,swsec000); break; case 2: if (! digitalRead (up) && digitalRead (down)) { if (hoursave > 59) hoursave ++; delay (200); } else if (digitalRead (up) && ! digitalRead (down)) { if (hoursave <59> 59) hoursave ++; delay (200); } else if (digitalRead (up) && ! digitalRead (down)) { if (hoursave <59> 59) hoursave ++; delay (200); } else if (digitalRead (up) && ! digitalRead (down)) { if (hoursave > 59) hoursave --; delay (200); } swday000 = hoursave; lcd.setCursor (0,0); lcd.print ("Days"); lcd.setCursor (1,1); lcd.print (swday000); RTC.set(DS1307_DATE,swday000); break; case 5: if (! digitalRead (up) && digitalRead (down)) { if (hoursave > 59) hoursave ++; delay (200); } else if (digitalRead (up) && ! digitalRead (down)) { if (hoursave > 59) hoursave --; delay (200); } swmon000 = hoursave; lcd.setCursor (0,0); lcd.print ("Monts"); lcd.setCursor (1,1); lcd.print (swmon000); RTC.set(DS1307_MTH,swmon000); break; case 7: if (! digitalRead (up) && digitalRead (down)) { if (hoursave > 59) hoursave ++; delay (200); } else if (digitalRead (up) && ! digitalRead (down)) { if (hoursave > 59) hoursave --; delay (200); } swyer000 = hoursave; lcd.setCursor (0,0); lcd.print ("Years"); lcd.setCursor (1,1); lcd.print (swyer000); RTC.set(DS1307_YR,swyer000); break; default: lcd.setCursor (0,0); lcd.print ("Set times"); lcd.setCursor (1,1); lcd.print ("And dadates"); break; } delay (5); }while (swset == LOW); RTC.start(); } void setup() { pinMode(12, INPUT);//Переключатель установки pinMode(11, INPUT); digitalWrite (11, HIGH); pinMode(10, INPUT); digitalWrite (10, HIGH); lcd.begin(16, 2);//экран у меня 16 символов на 2е строки lcd.home(); } void loop() { btn_read(); //проверяем переключатели if (swset==LOW){RTC_set2var();} //если переключатель установки 0 запускаем установку даты-времени else { RTC_red2var();//прочитать время в переменные delay(5); } }http://arduino.ru/forum/programmirovanie/menyu-dlya-tekstovogo-lcd-pomogite-optimizirovat
Спасибо. А мой код сверху можете взглянуть и сказать, что не так.................
Вместо
void var2LCD() {
lcd.clear(); //Очистка экрана
//Координаты ; Текст
lcd.setCursor (0,0); lcd.print (hr_00);
lcd.setCursor (2,0); lcd.print (delitel);
lcd.setCursor (3,0); lcd.print (mn_00);
lcd.setCursor (5,0); lcd.print (delitel);
lcd.setCursor (6,0); lcd.print (sc_00);
lcd.setCursor (0,1); lcd.print (DD_00);
lcd.setCursor (2,1); lcd.print ('-');
lcd.setCursor (3,1); lcd.print (MM_00);
lcd.setCursor (5,1); lcd.print ('-');
lcd.setCursor (6,1); lcd.print (YY_00);
}
Я бы написал
void var2LCD() { char buffer[9]; sprintf(buffer,"%02d:%02d:%02d",hr_00,mn_00,sc_00); lcd.setCursor(0,0); lcd.print(buffer); sprintf(buffer,"%02d-%02d-%02d",DD_00,MM_00,YY_00); lcd.setCursor(0,1); lcd.print(buffer); }В крайнем случае так:
void var2LCD() { lcd.clear(); //Очистка экрана //Координаты ; Текст lcd.setCursor (0,0); lcd.print (hr_00); lcd.print (delitel); lcd.print (mn_00); lcd.print (delitel); lcd.print (sc_00); lcd.setCursor (0,1); lcd.print (DD_00); lcd.print ('-'); lcd.print (MM_00); lcd.print ('-'); lcd.print (YY_00); }Спасибо. А что означает
А немогли бы посмотреть на мои кнопки установок времени, может что то нетак я прописал..............
"%" означает, что дальше идут символы форматирования
"02" - спецификатор ширины поля (2 символа), 0 указывает на то, что пустые позиции заполняются нулями.
"d" - вывод в формате целого числа
"-" - все, что стоит после спецификатора типа до следующего знака процента поступает на выход без изменения.
Подробнее прочитайте хотя бы здесь:
cppworld.h16.ru/stdc/stdio.htm
Спасибо. Буду изучать..........
#include <LiquidCrystal.h> #include <WProgram.h> #include <Wire.h> #include <DS1307.h> LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //Переменные для сохранения данных часов int hr_00; //часы int mn_00; //минуты int sc_00; //секунды int DD_00; //дни int MM_00; //месяцы int YY_00; //годы char buffer[9]; char delitel = ':'; //разделитель времени для отображения void setup(){ } void loop() { read_rtc1307();//прочитать время в переменные } void read_rtc1307() { hr_00=RTC.get(DS1307_HR,true); mn_00=RTC.get(DS1307_MIN,false); sc_00=RTC.get(DS1307_SEC,false); DD_00=RTC.get(DS1307_DATE,false); MM_00=RTC.get(DS1307_MTH,false); YY_00=RTC.get(DS1307_YR,false); lcd.begin(16,2); sprintf(buffer,"%02d:%02d:%02d",hr_00,mn_00,sc_00); lcd.setCursor(0,0); lcd.print(buffer); sprintf(buffer,"%02d-%02d-%02d",DD_00,MM_00,YY_00); lcd.setCursor(0,1); lcd.print(buffer); delay (1000); lcd.clear(); }Все заработало как надо, теперь работаю над кнопками установки времени...........
#include <LiquidCrystal.h> #include <WProgram.h> #include <Wire.h> #include <DS1307.h> LiquidCrystal lcd(7, 6, 5, 4, 3, 2); int swtime = 10; // кнопка установки времени int swtimeset; // переменная для хранения времени int swmenus; // переменная для хранения переключений параметров int menu = 8; // кнопка установки параметров часов int swset = 9; // кнопка для включения установки int swsets; / переменная для хранения включений и выключений установки //переменные для хранения времени во время установки int hoursave; int swsec000; int swmin000; int swhor000; int swday000; int swmon000; int swyer000; //Переменные для сохранения данных часов int hr_00; //часы int mn_00; //минуты int sc_00; //секунды int DD_00; //дни int MM_00; //месяцы int YY_00; //годы char buffer[9]; char delitel = ':'; //разделитель времени для отображения void setup() { pinMode (menu, INPUT); digitalWrite (menu, HIGH); pinMode (swtime, INPUT); digitalWrite (swset, HIGH); } void loop() { sw_read(); if (swsets == HIGH){sethour_rtc1307();} else { read_rtc1307();//прочитать время в переменные RTC_LCD(); delay (5); } } void sw_read() { swsets = digitalRead (9); } void read_rtc1307() { hr_00=RTC.get(DS1307_HR,true); mn_00=RTC.get(DS1307_MIN,false); sc_00=RTC.get(DS1307_SEC,false); DD_00=RTC.get(DS1307_DATE,false); MM_00=RTC.get(DS1307_MTH,false); YY_00=RTC.get(DS1307_YR,false); } void RTC_LCD() { lcd.begin(16,2); sprintf(buffer,"%02d:%02d:%02d",hr_00,mn_00,sc_00); lcd.setCursor(0,0); lcd.print(buffer); sprintf(buffer,"%02d-%02d-%02d",DD_00,MM_00,YY_00); lcd.setCursor(0,1); lcd.print(buffer); delay (1000); lcd.clear(); } void sethour_rtc1307() { do { RTC.stop(); sw_read(); swmenus = digitalRead (8); if (swmenus == 6) {swmenus ++;} switch (swmenus) { case 1: swtimeset = analogRead (10); if (swtimeset >= 60) {swtimeset = 59;} else {swtimeset ++;} swsec000 = swtimeset; lcd.setCursor (0,0); lcd.print ("Seconds"); lcd.setCursor (1,1); lcd.print (swsec000); RTC.set (DS1307_SEC, swsec000); break; case 2: swtimeset = analogRead (10); if (swtimeset >= 60) {swtimeset = 59;} else {swtimeset ++;} swmin000 = swtimeset; lcd.setCursor (0,0); lcd.print ("MINUT"); lcd.setCursor (1,1); lcd.print (swmin000); RTC.set (DS1307_MIN, swmin000); break; case 3: swtimeset = analogRead (10); if (swtimeset > 23) {swtimeset = 23;} else {swtimeset ++;} swhor000 = swtimeset; lcd.setCursor (0,0); lcd.print ("HOURS"); lcd.setCursor (1,1); lcd.print (swhor000); RTC.set (DS1307_HR, swhor000); break; case 4: swtimeset = analogRead (10); if (swtimeset > 31) {swtimeset = 31;} else {swtimeset ++;} swday000 = swtimeset; lcd.setCursor (0,0); lcd.print ("DAYS"); lcd.setCursor (1,1); lcd.print (swday000); RTC.set (DS1307_DATE, swday000); break; case 5: swtimeset = analogRead (10); if (swtimeset > 12) {swtimeset = 12;} if (swtimeset <= 0) {swtimeset = 1;} else {swtimeset ++;} swmon000 = swtimeset; lcd.setCursor (0,0); lcd.print ("MONTS"); lcd.setCursor (1,1); lcd.print (swmon000); RTC.set (DS1307_MTH, swmon000); break; case 6: swtimeset = analogRead (10); if (swtimeset > 100) {swtimeset = 100;} else {swtimeset ++;} swyer000 = swtimeset; lcd.setCursor (0,0); lcd.print ("YEAR"); lcd.setCursor (1,1); lcd.print (swyer000); RTC.set (DS1307_YR, swyer000); break; } delay (5); } while (swsets == HIGH); RTC.start(); }Не пойму почему все компилируется правильно но в желелезе неработает, подскажите пожалуйста где я неправильно написал код..........
Можно понатыкать Serial.println() с разными буквами и посмотреть где застревает
void read_rtc1307() { hr_00=RTC.get(DS1307_HR,true); mn_00=RTC.get(DS1307_MIN,false); sc_00=RTC.get(DS1307_SEC,false); DD_00=RTC.get(DS1307_DATE,false); MM_00=RTC.get(DS1307_MTH,false); YY_00=RTC.get(DS1307_YR,false); lcd.begin(16,2); sprintf(buffer,"%02d:%02d:%02d",hr_00,mn_00,sc_00); lcd.setCursor(0,0); lcd.print(buffer); sprintf(buffer,"%02d-%02d-%02d",DD_00,MM_00,YY_00); lcd.setCursor(0,1); lcd.print(buffer); delay (1000); lcd.clear(); }Все заработало как надо, теперь работаю над кнопками установки времени...........
И с чего бы вашей программе работать, если вы почти не оставили ей шансов среагировать на нажатие кнопок. Сделать это она может лишь в короткие промежутки времени между длительными блокировками микроконтроллера.
lcd.begin(16,2); - здесь производится инициализация дисплея. С очисткой от имеющейся на нем информации.
[...]
lcd.print(buffer);
delay (1000);
lcd.clear(); - здесь вы выводите информацию, ждете секунду (а по существу блокируете микроконтроллер на все это время), а потом стираете все.
Лучше сделать так: в начале процедуры стереть информацию с экрана (lcd.clear();), потом сформировать выводимый текст и вывести его на дисплей (lcd.print(buffer);). И ВСЕ! никаких инициализаций дисплея не требуется - она должна выполняться ОДИН РАЗ - в setup(). И НИКАКИХ delay(1000) - это самый надежный способ угробить любой работающий алгоритм.
Чтобы не слишком часто выполнять вывод на экран, в главном цикле (функция loop()) вызов процедуры read_rtc1307() делайте не каждый раз, а, например, по итогам проверки текущего времени:
if(millis()%1000==0) read_rtc1307();
(вывод каждую тысячную миллисекунду)
или if(millis()%1000<2) read_rtc1307();
(во втором случае - вывод каждую тысячную и тысяча первую миллисекунду (сделано с запасом, т.к. я не знаю, за сколько миллисекунд у вас прокручивается цикл )
Более аккуратный вариант - ввести переменную, в которой будет храниться время (в миллисекундах) последнего вывода на дисплей и определять момент очередного обновления текста на дисплее по количеству миллисекунд, прошедших с момента последнего обновления:
if(millis()-lastLcdModiified>1000) read_rtc1307();
и в начале процедуры read_rtc1307(): lastLcdModiified = millis();
Только после того, как избавитесь от вызванных безумными задержками ( = блокировками микроконтроллера) побочных эффектов (грубо: кнопка нажимается, а контроллер никак на это не реагирует), начинайте отлавливать другие баги.
И, поскольку опыта в программировании у вас пока с Гулькин ..., не пытайтесь реализовать сразу весь алгоритм - с работающей основы и добавляйте по одной реакции/функции. Только отладив очередной блок операторов, переходите к вводу нового. Иначе просто утонете в отладке.
Спасибо за дельный совет, буду пробывать.
#include <LiquidCrystal.h> #include <WProgram.h> #include <Wire.h> #include <DS1307.h> LiquidCrystal lcd(7, 6, 5, 4, 3, 2); unsigned long save_time; //переменная для хранения значений миллисекунд и переполнившись через 50 дней сбрасывается //Переменные для сохранения данных часов int hr_00; //часы int mn_00; //минуты int sc_00; //секунды int DD_00; //дни int MM_00; //месяцы int YY_00; //годы char buffer[9]; char delitel = ':'; //разделитель времени для отображения void setup() { lcd.begin(16,2); lcd.clear(); } void loop() { if(millis()-save_time>1000) read_lcd_rtc1307(); } void read_lcd_rtc1307() { hr_00=RTC.get(DS1307_HR,true); mn_00=RTC.get(DS1307_MIN,false); sc_00=RTC.get(DS1307_SEC,false); DD_00=RTC.get(DS1307_DATE,false); MM_00=RTC.get(DS1307_MTH,false); YY_00=RTC.get(DS1307_YR,false); save_time = millis(); //возвращает интервал времени в миллисекундах sprintf(buffer,"%02d:%02d:%02d",hr_00,mn_00,sc_00); lcd.setCursor(0,0); lcd.print(buffer); sprintf(buffer,"%02d-%02d-%02d",DD_00,MM_00,YY_00); lcd.setCursor(0,1); lcd.print(buffer); }Осталось разобратся с кнопками и с конструкцией switch case..................
#include <LiquidCrystal.h> #include <WProgram.h> #include <Wire.h> #include <DS1307.h> LiquidCrystal lcd(7, 6, 5, 4, 3, 2); unsigned long save_time; //Переменные для сохранения данных часов int hr_00; //часы int mn_00; //минуты int sc_00; //секунды int DD_00; //дни int MM_00; //месяцы int YY_00; //годы int swread; // переменная переключателя установки int X; int up; char buffer[9]; char delitel = ':'; //разделитель времени для отображения void setup() { pinMode(11, INPUT); pinMode(12, INPUT); lcd.begin(16,2); lcd.clear(); } void loop() { sw_read(); if (swread == LOW){set_rtc1307();} else { if(millis()-save_time>1000) read_lcd_rtc1307(); } } void read_lcd_rtc1307() { hr_00=RTC.get(DS1307_HR,true); mn_00=RTC.get(DS1307_MIN,false); sc_00=RTC.get(DS1307_SEC,false); DD_00=RTC.get(DS1307_DATE,false); MM_00=RTC.get(DS1307_MTH,false); YY_00=RTC.get(DS1307_YR,false); save_time = millis(); sprintf(buffer,"%02d:%02d:%02d",hr_00,mn_00,sc_00); lcd.setCursor(0,0); lcd.print(buffer); sprintf(buffer,"%02d-%02d-%02d",DD_00,MM_00,YY_00); lcd.setCursor(0,1); lcd.print(buffer); } void sw_read() { swread = digitalRead(12); } void set_rtc1307() { do { sw_read(); if(digitalRead(8) == HIGH&&X == 0) { up++; X++; } switch (X) { case 1: lcd.setCursor(0,0); lcd.print("A"); break; case 2: lcd.setCursor(0,0); lcd.print("B"); break; case 3: lcd.setCursor(0,0); lcd.print("C"); break; case 4: lcd.setCursor(0,0); lcd.print("D"); break; case 5: lcd.setCursor(0,0); lcd.print("E"); break; } }while(swread == LOW); X=0; } Немогли бы посмотреть код, что то не работает ..................... Если сможете объясните пожалуйста что не так я делаю, я очень хочу разобратся и научится программировать .....что значит - не работает?
Время не отображается?
Или функция set_rtc1307 не вызывается?
Что означает вот этот оператор (строка 65):
if(digitalRead(8) == HIGH&&X == 0)
Почему пин 8 не проинициализирован как вход?
Почему пин 11 объявлен в качестве входа, но не используется в программе?
Не задумывались о том, чтобы выводить отладочную информацию в окно терминала (в setup() создать объект Serial и во всех отлаживаемых местах поставить Serial.println("Отладочное сообщение"))?
int switchPin = 12; // Кнопку подключаем к 12 "ноге" ARDUINO int val; // Переменная для сохранения состояния кнопки int buttonState; // Переменная для сохранения состояния кнопки после нажатия int buttonPresses = 0; // Переменная для хранения состояния числа нажатия void setup() { pinMode(switchPin, INPUT); // "Нога" ARDUINO установим его как вход для кнопки Serial.begin(9600); buttonState = digitalRead(switchPin); // Прочитаем значение заданного цифровога вывода и сохраним его переменную "buttonState" } void loop() { val = digitalRead(switchPin); // Прочитаем значение заданного цифровога вывода и сохраним его переменную "val" if (val != buttonState) // Переменная "val" не равно переменной buttonState, пока состояние кнопки неизменилось { if (val == LOW) // Проверяем,нажата ли кнопка, но у нас LOW(низкое, то есть в 0) состояние,потомучто мы на нее ненажали { if (buttonPresses > 60) // Считаем нажатие кнопки до 60 buttonPresses = 0; buttonPresses++; // увеличиваем переменную buttonPresses на +1, мы на кнопку нажали и ее состояние поменяли Serial.print("Button has been pressed "); Serial.print(buttonPresses); Serial.println(" times"); } } buttonState = val; // Сохраним переменную buttonState состояния кнопки после нажатия в переменную val } Все работает счет от 1 до 60 но уменя не получается сделать счет с 0 до 60. Подскажите пожалуйста как организовать счет от 0 до 60
Зачем вам нужен счет с 0 до 60? Всегда полагал, что секунды и минуты изменяются в диапазоне от 0 до 59. Ну, можно еще от 1 до 60. Но от 0 до 60 зачем?
А по существу вопроса: перепишите строки 18-19 в виде
if (bbuttonPresses > 60)
buttonPresses = -1;
Спасибо за помощь. Зачем мне от 0 до 60 ?....это простоя делал с кнопкапками экспиременты, но а так для часов я собирался изменять диапазон от 0 до 59. Я в плотную изучаю ввод с кнопок, что бы у меня больше невозникало "глупых" вопросов. Все свои "удачные" экспиременты записываю в свою электронно - бумажную записную книжку, что бы если что где то вдруг забыл можно было бы подглядеть..................
int switchPin = 9; int val3; // Переменная для чтения кнопки int val2; // Переменная для чтения кнопки int buttonState; int lightMode = 0; int x = 0; int val1 = 0; int state = 0; int old_val = 0; int sw_x = 8; void setup() { Serial.begin(9600); pinMode(sw_x, INPUT); pinMode(switchPin, INPUT); } void loop() { menu_sw_x(); //Выбор case nem(); //Вход в case } void nem() { val3 = digitalRead(switchPin); delay(10); val2 = digitalRead(switchPin); if (val3 == val2) { if (val3 != buttonState) { if (val3 == LOW) { if (lightMode == 0) { lightMode = 1; } else { lightMode = 0; } } } buttonState = val2; } } void menu_sw_x () { val1 = digitalRead(sw_x); if ((val1 == HIGH) && (old_val == LOW)) { x++; delay(10); } old_val = val1; // val is now old, let's store it switch (x) { case 0: nem(); break; case 1: nem(); break; case 2: nem(); break; case 3: nem(); break; case 4: nem(); break; default: x=0; break; } Serial.print("Knopka= " ); Serial.print(x); Serial.println(""); } Работает кнопка (Х) на перебор case, но не могу придумать как зайти в эти настройки кнопкой (включил устройство а мне надо поменять настройки) ............. Подскажите пожалуйста, может что я не так делаю опять........