Помогите начинающему "Часы с lcdKeypadshield"

gatsby163
Offline
Зарегистрирован: 10.03.2014

Здравтсвуйте уважаемые форумчане, помогите привести код в рабочий вид. Это программа часов реального времени без использования ds1307, я понимаю что они будут не точные и то что при отключении питания будет сбиваться время, но это не суть, занялся я им в качестве тренировки (сам только начинаю освоение Arduino), а точнее тренировки в работе с аналоговой клавиатурой lcdkeypadshield. Практически все уже работает, осталось все скомпоновать в определенную последовательность. Нужно чтоб при включении питания запускалась установка Часов (функцию написал - работает), затем после нажатия клавиши Right - установка Минут, потом после нажатия клавиши Select запускались часы с этими значениями.

#include <LiquidCrystal.h>
int cnt, Sekunde, Minute, Chas=0;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// Определения для Keypad (номер пина и значения для кнопок)
// Значения уровней сигнала для кнопок
#define KEYPAD_PIN A0
#define ButtonUp_LOW 90
#define ButtonUp_HIGH 100
#define ButtonDown_LOW 240
#define ButtonDown_HIGH 280
#define ButtonLeft_LOW 390
#define ButtonLeft_HIGH 450
#define ButtonRight_LOW 0
#define ButtonRight_HIGH 50
#define ButtonSelect_LOW 620
#define ButtonSelect_HIGH 650

void setup()
{
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("D.S.P.T.");
    
}

//Процедура опроса клавиатуры, принимает адрес пина, возвращает код клавиши
// 1 - UP
// 2 - DOWN
// 3 - LEFT
// 4 - RIGHT
// 5 - SELECT
int ReadKey(int keyPin)
{
 int KeyNum=0;
 int KeyValue1=0;
 int KeyValue2=0;

do {
 KeyValue1=analogRead(keyPin);
 KeyValue2=analogRead(keyPin);
 } while (KeyValue1==KeyValue2&&KeyValue2!=1023);
 
 if (KeyValue2<ButtonUp_HIGH&&KeyValue2>ButtonUp_LOW) {KeyNum=1;}//Up
 if (KeyValue2<ButtonDown_HIGH&&KeyValue2>ButtonDown_LOW) {KeyNum=2;}//Down
 if (KeyValue2<ButtonLeft_HIGH&&KeyValue2>ButtonLeft_LOW) {KeyNum=3;}//Left
 if (KeyValue2<ButtonRight_HIGH&&KeyValue2>ButtonRight_LOW) {KeyNum=4;}//Right
 if (KeyValue2<ButtonSelect_HIGH&&KeyValue2>ButtonSelect_LOW) {KeyNum=5;}//Select
return KeyNum;
}

//Функция установки часов
void setupChas() 
{
int keyCode=0;
  lcd.begin(16,2);
  lcd.setCursor(0, 0);
  lcd.print("  Setup Chas  ");
  lcd.setCursor(7, 1);
  lcd.print(Chas);
do {
  keyCode=ReadKey(KEYPAD_PIN);
  if (keyCode==1){Chas++;delay(200);lcd.setCursor(7, 1);lcd.print(Chas);}
  if (keyCode==2){Chas--;delay(200);lcd.setCursor(7, 1);lcd.print(Chas);}
} while (keyCode!=5 && keyCode!=4);

  delay(200);

if (keyCode==4) {setupMinute();}
}

//Функция установки Минут
void setupMinute() 
{
int keyCode=0;
  lcd.begin(16,2);
  lcd.setCursor(0, 0);
  lcd.print("  Setup Minute  ");
  lcd.setCursor(7, 1);
  lcd.print(Minute);
do {
  keyCode=ReadKey(KEYPAD_PIN);
  if (keyCode==1){Minute++;delay(200);lcd.setCursor(7, 1);lcd.print(Minute);}
  if (keyCode==2){Minute--;delay(200);lcd.setCursor(7, 1);lcd.print(Minute);}
} while (keyCode!=5 && keyCode!=4);

  delay(200);
if (keyCode==5) {loop();}

}

void loop() 
{

  cnt++; //Запуск времени
  
    
  if(cnt==100)
  {
    lcd.setCursor(0, 0);
    lcd.print(Chas);
    lcd.print(":");
    lcd.print(Minute);
    lcd.print(":");
    lcd.println(Sekunde);
    
    Sekunde++; 
    if(Sekunde==60)
    {
      Sekunde=0;
      Minute++;     
      if(Minute==60)
      {
        Minute=0;
        Chas++;        
        if(Chas==24)
        {
          Chas=0;
        }
      }
    }    
    cnt=0;
  }    
  delay(10);
}

 

gatsby163
Offline
Зарегистрирован: 10.03.2014

Зря похоже регистрировался)))) сегодня наконецто решил задачу....завтра постараюсь с помощью осциллографа откалибровать точность часов...а то больно уж с DS1307 сложно работать...надеюсь - пока!!

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Ничего не сложно - есть же библиотеки)))

Делал таке бесполезнве часы....

gatsby163
Offline
Зарегистрирован: 10.03.2014

с библиотеками я могу максимум что сделать так это вывести время на дисплей)))а чтобы работать с переменными, или просто даже устанавливать время кнопками по шине i2c для меня пока фантастика, и причем ниодного примера в интернете не встретил, хотя перелопатил море сайтов - хотел сделать таймер, нашел на меге8 но блин там у автора исходника не сохранилось а есть всего лишь .hex файл. А с этими "бесполезными" часами я могу использовать переменные секунд, минут, часов...правда точность не идеальная но это програмно можно исправить.

com
Offline
Зарегистрирован: 06.09.2013

gatsby163 пишет:

с библиотеками я могу максимум что сделать так это вывести время на дисплей)))а чтобы работать с переменными, или просто даже устанавливать время кнопками по шине i2c для меня пока фантастика, и причем ниодного примера в интернете не встретил, хотя перелопатил море сайтов

рано сдались :)

http://arduino.ru/forum/programmirovanie/ds1307-pokazyvayut-strannoe-vre...

рабочая библиотека с примером подключения. прочитайте внимательно, и если все правильно подключите, то максимум через 10 минут у вас будут работающие часы реального времени на базе ds1307

gatsby163
Offline
Зарегистрирован: 10.03.2014

Да на первый взгляд эта библиотека проще, нв выходных постараюсь сделать на них установку времени кнопками....ну и если получится таймер. Спасибо com за наводку))))