RTC (DS1307) с ARDUINO

mik
Offline
Зарегистрирован: 29.01.2012

 


#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();
}

Все работает, но проблема немогу придумать как сделать установку часов, минут и т.д с кнопок.

А еще каждую секунду экра поддергивается. Помогите пожалуйста, я начинающий.........................

step962
Offline
Зарегистрирован: 23.05.2011

Цитата:

void rtc1307LCD() {
  LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
  lcd.begin(16,2);
  lcd.setCursor (0,0);

[...]

  delay(1000);
  lcd.clear();
}

Расскажите, из каких соображений производится инициализация объекта lcd при каждом выводе на дисплей?

И зачем вы стираете выведенную информацию после секундной задержки?

mik
Offline
Зарегистрирован: 29.01.2012

 А без иницилизации нечего и неработало.

whoim
Offline
Зарегистрирован: 03.11.2011

 производится инициализация объекта lcd при каждом выводе на дисплей?

подсказка - есть секция setup, у вас там уже все прописано. По поводу установок - нужно писать управляемую менюшку и "окно" ввода инфо. Пробуйте, учитесь, я тут где то выкладывал код для большой менюшки.

mik
Offline
Зарегистрирован: 29.01.2012

А не подскажете где можно увидеть это меню, ну я думал сделать меню на основе  switch case...... ну что неполучилось.

mik
Offline
Зарегистрирован: 29.01.2012

Первый вариант но как то у меня криво заработало, вот и подумал что я нетак сделал............
Решил переделать.........
#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); 
} 
}

 

whoim
Offline
Зарегистрирован: 03.11.2011
mik
Offline
Зарегистрирован: 29.01.2012

Спасибо. А мой код сверху можете взглянуть и сказать, что не так.................

step962
Offline
Зарегистрирован: 23.05.2011

Вместо

Цитата:

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);
}

 

mik
Offline
Зарегистрирован: 29.01.2012

 Спасибо. А что означает 

"%02d-%02d-%02d"

А немогли бы посмотреть на мои кнопки установок времени, может что то нетак я прописал..............

step962
Offline
Зарегистрирован: 23.05.2011

 "%" означает, что дальше идут символы форматирования

"02" - спецификатор ширины поля (2 символа), 0 указывает на то, что пустые позиции заполняются нулями.

"d" - вывод в формате целого числа

"-" - все, что стоит после спецификатора типа до следующего знака процента поступает на выход без изменения.

Подробнее прочитайте хотя бы здесь:

cppworld.h16.ru/stdc/stdio.htm

mik
Offline
Зарегистрирован: 29.01.2012

Спасибо. Буду изучать..........

mik
Offline
Зарегистрирован: 29.01.2012
#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();
}

 Все заработало как надо, теперь работаю над кнопками установки времени...........

mik
Offline
Зарегистрирован: 29.01.2012
#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();

}

 Не пойму почему все компилируется правильно но в желелезе неработает, подскажите пожалуйста где я неправильно написал код..........

Zaliv
Offline
Зарегистрирован: 05.03.2011

 Можно понатыкать Serial.println() с разными буквами и посмотреть где застревает

step962
Offline
Зарегистрирован: 23.05.2011

mik пишет:

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();

Только после того, как избавитесь от вызванных безумными задержками ( = блокировками микроконтроллера) побочных эффектов (грубо: кнопка нажимается, а контроллер никак на это не реагирует), начинайте отлавливать другие баги.

И, поскольку опыта в программировании у вас пока с Гулькин ..., не пытайтесь реализовать сразу весь алгоритм - с работающей основы и добавляйте по одной реакции/функции. Только отладив очередной блок операторов, переходите к вводу нового. Иначе просто утонете в отладке.

 

 

mik
Offline
Зарегистрирован: 29.01.2012

 Спасибо за дельный совет, буду пробывать.

mik
Offline
Зарегистрирован: 29.01.2012

 

#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..................

mik
Offline
Зарегистрирован: 29.01.2012
#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; 
}
Немогли бы посмотреть код, что то не работает ..................... Если сможете объясните пожалуйста что не так я делаю, я очень хочу разобратся и научится программировать .....

 

step962
Offline
Зарегистрирован: 23.05.2011

 что значит - не работает?

Время не отображается?

Или функция set_rtc1307 не вызывается?

Что означает вот этот оператор (строка 65):

if(digitalRead(8) == HIGH&&X == 0)

Почему пин 8 не проинициализирован как вход?

Почему пин 11 объявлен в качестве входа, но не используется в программе?

Не задумывались о том, чтобы выводить отладочную информацию в окно терминала (в setup() создать объект Serial и во всех отлаживаемых местах поставить Serial.println("Отладочное сообщение"))?
 

mik
Offline
Зарегистрирован: 29.01.2012

 

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
step962
Offline
Зарегистрирован: 23.05.2011

 Зачем вам нужен счет с 0 до 60? Всегда полагал, что секунды и минуты изменяются в диапазоне от 0 до 59. Ну, можно еще от 1 до 60. Но от 0 до 60 зачем?

А по существу вопроса: перепишите строки 18-19 в виде

if (bbuttonPresses > 60)

buttonPresses = -1;

mik
Offline
Зарегистрирован: 29.01.2012

 Спасибо за помощь. Зачем мне от 0 до 60 ?....это простоя делал с кнопкапками экспиременты, но а так для часов я собирался изменять диапазон от 0 до 59. Я в плотную изучаю ввод с кнопок, что бы у меня больше невозникало "глупых" вопросов. Все свои "удачные" экспиременты записываю в свою электронно - бумажную записную книжку, что бы если что где то вдруг забыл можно было бы подглядеть..................

mik
Offline
Зарегистрирован: 29.01.2012
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, но не могу придумать как зайти в эти настройки кнопкой (включил устройство а мне надо поменять настройки) ............. Подскажите пожалуйста, может что я не так делаю опять........