Помогите собрать часы на ардуино

kylibin666
Offline
Зарегистрирован: 10.03.2013

есть uno r3, DS 1302 и дисплей QC 1602, по сути нужен скетч и помощь по подключению 1302

paf
Offline
Зарегистрирован: 25.01.2013

Участник с таким ником....   Кстати, хозяин числа за плагиат не...?

Имхо, должен сам всех "строить"! 

Помочь можно нику chaynik000 ;))))

kylibin666
Offline
Зарегистрирован: 10.03.2013

Ник этот за другие заслуги, а вот в ардуине пока чайник, но это пока... По существу кто то может подсказать "чайнеку"!!!

msng
Offline
Зарегистрирован: 07.06.2012

Hello world запускали?

kylibin666
Offline
Зарегистрирован: 10.03.2013

Да это запускал, проблем не возникло, тока опять же скетч скопировал, поправил порты и всё. Хотелось бы чтоб на этом примере кто толковый объяснил что по чем. Заранее спасибо!

msng
Offline
Зарегистрирован: 07.06.2012

про 1302 не расскажу, не интересны, т.к. купил десяток 1307...

kylibin666
Offline
Зарегистрирован: 10.03.2013

да не нужно про 1302 рассказывать, если можно то про сам процесс написания скетча на примере этих часов

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

kylibin666 пишет:

да не нужно про 1302 рассказывать, если можно то про сам процесс написания скетча на примере этих часов

Это Вам надо почитать про основы программирования на C++, после чего поставить себе IDE для ардуино и делать в нем все точно так же...

kylibin666
Offline
Зарегистрирован: 10.03.2013

что за IDE?

std
Offline
Зарегистрирован: 05.01.2012

Andrey_Y_Osta

Наличие ответа про Hello world от автора какбе намекает что он уже установил среду и пишет в ней скетчи.

kylibin666

библа для 1302, пример внутри:

https://github.com/msparks/arduino-ds1302

kylibin666
Offline
Зарегистрирован: 10.03.2013

std спасибо за ссылку, нашел еще библиотек на http://henningkarlsen.com/electronics/library.php?id=5 там как раз на ds 1302 рабочая библа, повторю еще раз, я не програмист, я механик, но хотелось бы разобраться на примерах как писать скетчи, несложные для начала, вот-

Hello world!

foo bar baz

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

kylibin666
Offline
Зарегистрирован: 10.03.2013

Вобщем кому не трудно, помогите :)

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Если хотите научиться писать программы - надо сначала почитать соответствующую базовую литературу, чтобы хотя бы говорить на одном языке с теми, кто уже умеет. Без базовых знаний - не научитесь. Не стоит расссчитывать на то, что как только найдете подходящую библиотеку - все сразу станет ясно и понятно: наоборот, библиотеки пишут с минимумом комментариев, и разобраться в ней начинающему - практически нереально.

kylibin666
Offline
Зарегистрирован: 10.03.2013

ну если так, то сажусь читать, только тогда подскажите с чего начать?

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

http://padabum.com/d.php?id=2037

"C++ для "чайников" Стефан Р. Дэвис"

Хотя бы пробежать текст глазами и научиться отличать в коде функцию от дефайна. :) Дальше уже можно пытаться писать свои "Hello World".

kylibin666
Offline
Зарегистрирован: 10.03.2013

Спасибо Andrey_Y_Ostan!

PASHASV
Offline
Зарегистрирован: 13.06.2013

http://henningkarlsen.com/electronics/download.php?f=DS1302.rar Я оттуда утянул. И  библиотека нормальная и примеры тоже. Единственное - пины под свой проект переписал и все...

Casper
Offline
Зарегистрирован: 02.10.2012

kylibin666 пишет:

есть uno r3, DS 1302 и дисплей QC 1602, по сути нужен скетч и помощь по подключению 1302

Примитив. Там по сути 2 чипа рядом соединить.

Когда-то расковырял китайские сдохшие часы (там дисплей живой остался), к нему и пристыковался. Был один из первых "проектов" на дуине.

Код такой вот

#include <OneWire.h>
#include <DS1302.h>
#include <TimerOne.h>
#define  _9_B 0x1F //  9 bit
#define _10_B 0x3F // 10 bit
#define _11_B 0x5F // 11 bit
#define _12_B 0x7F // 12 bit

int SPC_1_0=(B01111111<<8)+B11111111;
int SPC_1_1=(B01000111<<8)+B11111111;
int SPC_1_2=(B01111000<<8)+B01111111;
int SPC_1_3=(B01111111<<8)+B10001111;
int SPC_1_4=(B01111111<<8)+B11110000;
int SPC_2_0=(B10111111<<8)+B11111111;
int SPC_2_1=(B10000011<<8)+B11111111;
int SPC_2_2=(B10111100<<8)+B01111111;
int SPC_2_3=(B10111111<<8)+B10000111;
int SPC_2_4=(B10111111<<8)+B11111000;
int SPC_1=(B11111111<<8)+B11111111;
int SPC_2=(B11111111<<8)+B11111111;
int Tbl_1_1[]={
  (B01000000<<8)+B00000000, //0
  (B01000000<<8)+B00000000, //1
  (B01011000<<8)+B00000000, //2
  (B01011000<<8)+B00000000, //3
  (B01000000<<8)+B00000000, //4
  (B01111000<<8)+B00000000, //5
  (B01111000<<8)+B00000000, //6
  (B01010000<<8)+B00000000, //7
  (B01111000<<8)+B00000000, //8
  (B01111000<<8)+B00000000, //9
  (B01000000<<8)+B00000000, //SPACE 100
  (B01000000<<8)+B00000000, //SPACE 101
  (B01011000<<8)+B00000000, //==    102
  (B01000000<<8)+B00000000, //SPACE 103
  (B01000000<<8)+B00000000, //SPACE 104
  (B01000000<<8)+B00000000, //SPACE 105
  (B01000000<<8)+B00000000, //SPACE 106
  (B01000000<<8)+B00000000, //SPACE 107
  (B01000000<<8)+B00000000, //SPACE 108
  (B01110000<<8)+B00000000, //SPACE 109
  (B01110000<<8)+B00000000  //SPACE 110
}; 
int Tbl_1_2[]={
  (B01000101<<8)+B10000000, //0
  (B01000000<<8)+B00000000, //1
  (B01000111<<8)+B00000000, //2
  (B01000011<<8)+B00000000, //3
  (B01000010<<8)+B10000000, //4
  (B01000011<<8)+B10000000, //5
  (B01000111<<8)+B10000000, //6
  (B01000000<<8)+B00000000, //7
  (B01000111<<8)+B10000000, //8
  (B01000011<<8)+B10000000, //9
  (B01000000<<8)+B00000000, //SPACE 100
  (B01000010<<8)+B00000000, //SPACE 101
  (B01000001<<8)+B00000000, //==    102
  (B01000000<<8)+B00000000, //SPACE 103
  (B01000000<<8)+B00000000, //SPACE 104
  (B01000000<<8)+B00000000, //SPACE 105
  (B01000000<<8)+B00000000, //SPACE 106
  (B01000000<<8)+B00000000, //SPACE 107
  (B01000000<<8)+B00000000, //SPACE 108
  (B01000010<<8)+B10000000, //SPACE 109
  (B01000010<<8)+B10000000  //SPACE 110
};
int Tbl_1_3[]={
  (B01000000<<8)+B01110000, //0
  (B01000000<<8)+B00110000, //1
  (B01000000<<8)+B01100000, //2
  (B01000000<<8)+B01110000, //3
  (B01000000<<8)+B00110000, //4
  (B01000000<<8)+B01010000, //5
  (B01000000<<8)+B01010000, //6
  (B01000000<<8)+B01110000, //7
  (B01000000<<8)+B01110000, //8
  (B01000000<<8)+B01110000, //9
  (B01000000<<8)+B00000000, //SPACE 100
  (B01000000<<8)+B00000000, //SPACE 101
  (B01000000<<8)+B01000000, //==    102
  (B01000000<<8)+B00000000, //SPACE 103
  (B01000000<<8)+B00000000, //SPACE 104
  (B01000000<<8)+B00000000, //SPACE 105
  (B01000000<<8)+B00000000, //SPACE 106
  (B01000000<<8)+B00000000, //SPACE 107
  (B01000000<<8)+B00000000, //SPACE 108
  (B01000000<<8)+B01110000, //SPACE 109
  (B01000000<<8)+B01100000  //SPACE 110
};
int Tbl_1_4[]={
  (B01000000<<8)+B00001011, //0
  (B01000000<<8)+B00000000, //1
  (B01000000<<8)+B00001110, //2
  (B01000000<<8)+B00000110, //3
  (B01000000<<8)+B00000101, //4
  (B01000000<<8)+B00000111, //5
  (B01000000<<8)+B00001111, //6
  (B01000000<<8)+B00000000, //7
  (B01000000<<8)+B00001111, //8
  (B01000000<<8)+B00000111, //9
  (B01000000<<8)+B00000000, //SPACE 100
  (B01000000<<8)+B00000100, //SPACE 101
  (B01000000<<8)+B00000010< //==    102
  (B01000000<<8)+B00000000, //SPACE 103
  (B01000000<<8)+B00000000, //SPACE 104
  (B01000000<<8)+B00000000, //SPACE 105
  (B01000000<<8)+B00000000, //SPACE 106
  (B01000000<<8)+B00000000, //SPACE 107
  (B01000000<<8)+B00000000, //SPACE 108
  (B01000000<<8)+B00001101, //SPACE 109
  (B01000000<<8)+B00000101  //SPACE 110
}; 

int Tbl_2_1[]={
  (B10000000<<8)+B00000000, //0
  (B10100100<<8)+B00000000, //1
  (B10111000<<8)+B00000000, //2
  (B10110100<<8)+B00000000, //3
  (B10110100<<8)+B00000000, //4
  (B10010100<<8)+B00000000, //5
  (B10011100<<8)+B00000000, //6
  (B10100100<<8)+B00000000, //7
  (B10111100<<8)+B00000000, //8
  (B10110100<<8)+B00000000, //9
  (B10000000<<8)+B00000000, //SPACE 100
  (B10010000<<8)+B00000000, //SPACE 101
  (B10000000<<8)+B00000000, //==    102
  (B10000000<<8)+B00000000, //SPACE 103
  (B10000000<<8)+B00000000, //SPACE 104
  (B10000000<<8)+B00000000, //SPACE 105
  (B10000000<<8)+B00000000, //SPACE 106
  (B10000000<<8)+B00000000, //SPACE 107
  (B10000000<<8)+B00000000, //SPACE 108
  (B10111100<<8)+B00000000, //SPACE 109
  (B10110000<<8)+B00000000  //SPACE 110
}; 
int Tbl_2_2[]={
  (B10000011<<8)+B10000000, //0
  (B10000011<<8)+B00000000, //1
  (B10000010<<8)+B10000000, //2
  (B10000011<<8)+B10000000, //3
  (B10000011<<8)+B00000000, //4
  (B10000001<<8)+B10000000, //5
  (B10000001<<8)+B10000000, //6
  (B10000011<<8)+B10000000, //7
  (B10000011<<8)+B10000000, //8
  (B10000011<<8)+B10000000, //9
  (B10000000<<8)+B00000000, //SPACE 100
  (B10000000<<8)+B00000000, //SPACE 101
  (B10000000<<8)+B10000000, //==    102
  (B10000000<<8)+B00000000, //SPACE 103
  (B10000000<<8)+B00000000, //SPACE 104
  (B10000000<<8)+B00000000, //SPACE 105
  (B10000000<<8)+B00000000, //SPACE 106
  (B10000000<<8)+B00000000, //SPACE 107
  (B10000000<<8)+B00000000, //SPACE 108
  (B10000011<<8)+B10000000, //SPACE 109
  (B10000010<<8)+B10000000  //SPACE 110
};
int Tbl_2_3[]={
  (B10000000<<8)+B01011000, //0
  (B10000000<<8)+B00000000, //1
  (B10000000<<8)+B00111000, //2
  (B10000000<<8)+B00110000, //3
  (B10000000<<8)+B01100000, //4
  (B10000000<<8)+B01110000, //5
  (B10000000<<8)+B01111000, //6
  (B10000000<<8)+B00000000, //7
  (B10000000<<8)+B01111000, //8
  (B10000000<<8)+B01110000, //9
  (B10000000<<8)+B00000000, //SPACE 100
  (B10000000<<8)+B00100000, //SPACE 101
  (B10000000<<8)+B00010000, //==    102
  (B10000000<<8)+B00000000, //SPACE 103
  (B10000000<<8)+B00000000, //SPACE 104
  (B10000000<<8)+B00000000, //SPACE 105
  (B10000000<<8)+B00000000, //SPACE 106
  (B10000000<<8)+B00000000, //SPACE 107
  (B10000000<<8)+B00000000, //SPACE 108
  (B10000000<<8)+B01101000, //SPACE 109
  (B10000000<<8)+B01100000  //SPACE 110
};
int Tbl_2_4[]={
  (B10000000<<8)+B00000111, //0
  (B10000000<<8)+B00000110, //1
  (B10000000<<8)+B00000101, //2
  (B10000000<<8)+B00000111, //3
  (B10000000<<8)+B00000110, //4
  (B10000000<<8)+B00000011, //5
  (B10000000<<8)+B00000011, //6
  (B10000000<<8)+B00000111, //7
  (B10000000<<8)+B00000111, //8
  (B10000000<<8)+B00000111, //9
  (B10000000<<8)+B00000000, //SPACE 100
  (B10000000<<8)+B00000000, //SPACE 101
  (B10000000<<8)+B00000001, //==    102
  (B10000000<<8)+B00000000, //SPACE 103
  (B10000000<<8)+B00000000, //SPACE 104
  (B10000000<<8)+B00000000, //SPACE 105
  (B10000000<<8)+B00000000, //SPACE 106
  (B10000000<<8)+B00000000, //SPACE 107
  (B10000000<<8)+B00000000, //SPACE 108
  (B10000000<<8)+B00000111, //SPACE 109
  (B10000000<<8)+B00000101  //SPACE 110
}; 

char Chrt[]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,'В©',' ','C','a','s','p','e','r',' ','2','0','1','2'};
byte Hl[4]={255,255,255,254};
int itm=0;
int j=0,i=0;
int hourl=0;
byte Mode=8;
DS1302 RTC(4, 3, 2);
Time T;
byte PC,oPC,PC1cnt=0;
int Point;
byte SETUP8=0,TermoM=0;
byte present = 0;
byte data[12];
byte addr[8];
OneWire W(10);
boolean IsSens=false;
float TermoF;

void MelodyStart(){
  tone(13,1000,100);delay(100);
  tone(13,1100,100);delay(100);
  tone(13,1250,100);delay(100);
  tone(13,1530,100);delay(100);
  tone(13,1950,100);delay(100);
}  
void MON(int H=0, int M=0){
  byte C[4];
  if (H==100){
    C[0]=10;
    C[1]=10;
  }else if (H == 1000){
    C[0]=20;
    C[1]=10;
  }else if (H == 1001){
    C[0]=20;
    C[1]=20;
  }else if (H > 100){
    H = H - 100;
    C[0] = H + 10;
    C[1] = H + 10;
  }else if (H < 0) {
    C[0]=11;
    H=-H;
    C[1]=H%10;
  }else{
    C[0] = H/10;
    C[1] = H%10;
  }
  if (M==100){
    C[2]=10;
    C[3]=10;
  }else if (M > 100){
    M = M - 100;
    C[2] = M + 10;
    C[3] = M + 10;    
  }else{
    C[2] = M/10;
    C[3] = M%10;
  }
  int D1=(Tbl_1_1[C[0]] | Tbl_1_2[C[1]] | Tbl_1_3[C[2]] | Tbl_1_4[C[3]]) & SPC_1;
  int D2=(Tbl_2_1[C[0]] | Tbl_2_2[C[1]] | Tbl_2_3[C[2]] | Tbl_2_4[C[3]]) & SPC_2;
  PORTD = PORTD & B10111111; //latch low
  shiftOut(7,5,LSBFIRST,D1);
  shiftOut(7,5,LSBFIRST,(D1>>8));
  PORTD = PORTD | B01000000; //latch low
  PORTD = PORTD & B10111111; //latch low
  shiftOut(7,5,LSBFIRST,D2);
  shiftOut(7,5,LSBFIRST,(D2>>8));
  PORTD = PORTD | B01000000; //latch low
}
void MON4(int m1=10, int m2=10, int m3=10, int m4=10){
  int D1=(Tbl_1_1[m1] | Tbl_1_2[m2] | Tbl_1_3[m3] | Tbl_1_4[m4]) & SPC_1;
  int D2=(Tbl_2_1[m1] | Tbl_2_2[m2] | Tbl_2_3[m3] | Tbl_2_4[m4]) & SPC_2;
  PORTD = PORTD & B10111111; //latch low
  shiftOut(7,5,LSBFIRST,D1);
  shiftOut(7,5,LSBFIRST,(D1>>8));
  PORTD = PORTD | B01000000; //latch low
  PORTD = PORTD & B10111111; //latch low
  shiftOut(7,5,LSBFIRST,D2);
  shiftOut(7,5,LSBFIRST,(D2>>8));
  PORTD = PORTD | B01000000; //latch low
}
void MONx(byte m1=0, byte m2=0, byte m3=0, byte m4=0){
  int D1=(B01111111<<8)+B11111111;
  int D2=(B10111111<<8)+B11111111;
  //IND1
  bitWrite(D1,12,bitRead(m1,7)); //A
  bitWrite(D2,13,bitRead(m1,6)); //B
  bitWrite(D2,10,bitRead(m1,5)); //C
  bitWrite(D1,11,bitRead(m1,4)); //D
  bitWrite(D2,11,bitRead(m1,3)); //E
  bitWrite(D1,13,bitRead(m1,2)); //F
  bitWrite(D2,12,bitRead(m1,1)); //G
  //IND2
  bitWrite(D2, 7,bitRead(m2,7)); //A
  bitWrite(D2, 9,bitRead(m2,6)); //B
  bitWrite(D2, 8,bitRead(m2,5)); //C
  bitWrite(D1, 8,bitRead(m2,4)); //D
  bitWrite(D1,10,bitRead(m2,3)); //E
  bitWrite(D1, 7,bitRead(m2,2)); //F
  bitWrite(D1, 9,bitRead(m2,1)); //G
  //IND3
  bitWrite(D1, 6,bitRead(m3,7)); //A
  bitWrite(D1, 5,bitRead(m3,6)); //B
  bitWrite(D1, 4,bitRead(m3,5)); //C
  bitWrite(D2, 4,bitRead(m3,4)); //D
  bitWrite(D2, 3,bitRead(m3,3)); //E
  bitWrite(D2, 6,bitRead(m3,2)); //F
  bitWrite(D2, 5,bitRead(m3,1)); //G
  //IND4
  bitWrite(D2, 0,bitRead(m4,7)); //A
  bitWrite(D2, 2,bitRead(m4,6)); //B
  bitWrite(D2, 1,bitRead(m4,5)); //C
  bitWrite(D1, 1,bitRead(m4,4)); //D
  bitWrite(D1, 3,bitRead(m4,3)); //E
  bitWrite(D1, 0,bitRead(m4,2)); //F
  bitWrite(D1, 2,bitRead(m4,1)); //G
  D1 = D1 & SPC_1;
  D2 = D2 & SPC_2;
  PORTD = PORTD & B10111111; //latch low
  shiftOut(7,5,LSBFIRST,D1);
  shiftOut(7,5,LSBFIRST,(D1>>8));
  PORTD = PORTD | B01000000; //latch low
  PORTD = PORTD & B10111111; //latch low
  shiftOut(7,5,LSBFIRST,D2);
  shiftOut(7,5,LSBFIRST,(D2>>8));
  PORTD = PORTD | B01000000; //latch low
}
boolean sensorinit(){
  boolean flg=false;
  if (!W.search(addr)){
    flg=false;
  }else flg=true;
  W.reset();
  W.select(addr);
  W.write(0x4E); //Scratch
  W.write(0x2);
  W.write(0x3);
  W.write(_12_B);
  W.write(0x48,0); // Copy
  return (flg);
}
void sensorstart(){
  W.reset();
  W.select(addr);
  W.write(0x44,1);
  //delay(500);
}
float sensorterm(){
  present=W.reset();
  W.select(addr);
  W.write(0xBE);
  for (int i=0; i<9; i++) data[i]=W.read();
  int HB, LB;
  float TC, FR;
  LB=data[0];
  HB=data[1];
  int16_t TR = (((int16_t)HB) << 8) | LB;
  if (TR&0x8000) TR = (TR ^ 0xffff) + 1;
  TC = TR ;//* 6.25;
  FR = (float)TR * 0.0625;// TC / 100;
  if (TR & 0x8000) FR = -FR;
  return(FR);
}
void PIP(){
  tone(13,5000,50);
}
void TMR(){
  //tone(13,20000,1);
  T=RTC.getTime();
  if (T.hour!=hourl){
    hourl=T.hour;
    tone(13,5000,450);
  }
  Point++;
  if (bitRead(PC,1)==0){
    PC1cnt++;
    if (PC1cnt>=5) {Mode=0; PIP();PC1cnt=0;}
  }else PC1cnt=0;
  if (IsSens){
    if (TermoM==0) sensorstart();
    if (TermoM==2) TermoF=sensorterm();
    TermoM++;if (TermoM>2) TermoM=0;
  }
}
void DYSPLAY(){
  int Y1=0, Y2=0;
  switch (Mode){
    case 0:  //Standart Time
      if (T.hour==27 && T.min==85) MON(102,102); else MON(T.hour,T.min);
      if (itm==0) if (Point%2==0) PORTB = PORTB & B11111101; else PORTB = PORTB | B00000010; else PORTB = PORTB | B00000010;
      if (itm==1){
        if (Point%2!=0) {
          SPC_1=SPC_1_1 & SPC_1_2;
          SPC_2=SPC_2_1 & SPC_2_2;
        }else{
          SPC_1=SPC_1_0;
          SPC_2=SPC_2_0;
        }
      }else if (itm==2){
        if (Point%2!=0) {
          SPC_1=SPC_1_3 & SPC_1_4;
          SPC_2=SPC_2_3 & SPC_2_4;
        }else{
          SPC_1=SPC_1_0;
          SPC_2=SPC_2_0;
        }
      }else{
        SPC_1=SPC_1_0;
        SPC_2=SPC_2_0;
      }
      //bitWrite(Hl[2],0,1);    
      //bitWrite(Hl[3],0,1);    
      break;
    case 1:  // Date View
      if (T.mon==85 && T.date==85) MON(102,102); else MON(T.date,T.mon);
      PORTB = PORTB & B11111101;
      PORTD = PORTD | B00000010;
      if (itm==1){
        if (Point%2!=0) {
          SPC_1=SPC_1_1 & SPC_1_2;
          SPC_2=SPC_2_1 & SPC_2_2;
        }else{
          SPC_1=SPC_1_0;
          SPC_2=SPC_2_0;
        }
      }else if (itm==2){
        if (Point%2!=0) {
          SPC_1=SPC_1_3 & SPC_1_4;
          SPC_2=SPC_2_3 & SPC_2_4;
        }else{
          SPC_1=SPC_1_0;
          SPC_2=SPC_2_0;
        }
      }else{
        SPC_1=SPC_1_0;
        SPC_2=SPC_2_0;
      }
      break;
    case 2: //date year
      Y1=T.year/100;
      Y2=T.year-Y1*100;
      if (T.mon==85 && T.date==85) MON(102,102); else MON(Y1,Y2);
      PORTB = PORTB & B11111101;
      PORTD = PORTD | B00000010;
      if (itm==1){
        if (Point%2!=0) {
          SPC_1=SPC_1_1 & SPC_1_2 & SPC_1_3 & SPC_1_4;
          SPC_2=SPC_2_1 & SPC_2_2 & SPC_2_3 & SPC_2_4;
        }else{
          SPC_1=SPC_1_0;
          SPC_2=SPC_2_0;
        }
      }else{
        SPC_1=SPC_1_0;
        SPC_2=SPC_2_0;
      }
      break;
    case 3:  //Seconds Only
      if (T.sec==85) MON(100,102); else MON(100,T.sec);
      PORTB = PORTB | B00000010;
      PORTD = PORTD & B11111100;
      //bitWrite(Hl[0],0,1);    
      //bitWrite(Hl[1],0,0);    
      //bitWrite(Hl[2],0,1);    
      //bitWrite(Hl[3],0,1);    
      break;
    case 4:  //Termometr
      if (IsSens) { //термометр есть
        MON(88,88);
      }else{        //Термометра нет.
        MONx(B11000110,B00011110,B10011110,B00001010); //t  E
      }
      //PORTB = PORTB & B11111101;
      PORTB = PORTB | B00010000;
      digitalWrite(12,HIGH);
      PORTD = PORTD | B00000001;
      break;
    case 5:  //Alarm 1
      PORTB = PORTB | B00010000;
      //digitalWrite(12,HIGH);
      PORTD = PORTD & B11111100;
      MON4(19,1);
      break;
    case 6:  //Alarm 2
      MON4(19,2);
      PORTD = PORTD & B11111100;
      break;    
    case 7:  //Setup
      MONx(B00010000,B00010000,B00010000,B00010000);
      PORTD = PORTD | B00000011;
      break;
    case 8: //PORT
      if (bitRead(SETUP8,0)==0) MON(1000,100);else MON(1001,100);
      PORTD = PORTD & B11111100;
      if (itm==1){
        if (Point%2!=0) {
          SPC_1=SPC_1_1 & SPC_1_2;
          SPC_2=SPC_2_1 & SPC_2_2;
        }else{
          SPC_1=SPC_1_0;
          SPC_2=SPC_2_0;
        }
      }else{
        SPC_1=SPC_1_0;
        SPC_2=SPC_2_0;
      }
      break;
    default:
      Mode=0;
  }  
}
void InPort(){
  if (bitRead(SETUP8,0)!=0){
    Serial.begin(115200);
  }else{
    Serial.end();
  }
}
void StoreSetup(){
  RTC.poke(0,SETUP8);
  RTC.poke(1,Mode);
  for (int i=18; i<=30;i++){
    RTC.poke(i,Chrt[i]);
  }
}
void LoadSetup(){
  SETUP8=RTC.peek(0);
  Mode=RTC.peek(1);
}
void setup() {
  DDRD = B11111111;
  DDRB = B00010010;
  PORTD = PORTD & B10111100; //latch low
  shiftOut(7,5,0,B00000000); // Out 2 registr
  shiftOut(7,5,0,B00000000); // Out 1 registr 6 and 7 low for cathode
  PORTD = PORTD | B01000000; //latch high
  tone(13,5000,50);
  delay(1000);
  RTC.writeProtect(false);
  T=RTC.getTime();
  hourl = T.hour;
  LoadSetup();
  InPort();
  MelodyStart();
  IsSens=sensorinit();
  //Serial.begin(115200);
  Timer1.initialize(500000); // 500ms period
  Timer1.attachInterrupt( TMR );
}
void loop() {
  PC=PINC;
  if (Serial.available() > 0) {
    byte TTH[10];
    byte iB = Serial.read();
    switch(iB){
      case 122:
        bitWrite(PC,1,0);
        Serial.print("Mode Switch CUR=");
        Serial.println(Mode);
        break;
      case 120:
        bitWrite(PC,2,0);
        Serial.println("Item Prev Switch");
        break;
      case 99:
        bitWrite(PC,3,0);
        Serial.println("Data Upper Switch");
        break;
      case 118:
        bitWrite(PC,4,0);
        Serial.println("Data Lower Switch");
        break;
      case 98:
        bitWrite(PC,5,0);
        Serial.println("Item Next Switch");
        break;
      case 70: //F
        Serial.print(T.hour);
        Serial.print(":");
        Serial.print(T.min);
        Serial.print(":");
        Serial.print(T.sec);
        Serial.print("  -  ");
        Serial.print(T.date);
        Serial.print("/");
        Serial.print(T.mon);
        Serial.print("/");
        Serial.print(T.year);
        Serial.println(" ");
        break;
      case 77:
        int Bbb;
        for (int i=0; i<=30;i++){
          Bbb=RTC.peek(i);
          Serial.print(char(Bbb));
        }
        Serial.println(" ");
        break;
      case 78:
        for (int i=18; i<=30;i++){
          RTC.poke(i,Chrt[i]);
        }
        Serial.println("CP Writed");
        break;
      case 84: //T - set time as format HH:MM:SS
        MON(100,100);
        for (int i=0; i<=7; i++){
          TTH[i]=Serial.read();
        }
        if (TTH[2]==':' && TTH[5]==':') {
          for (int i=0; i<=7; i++) TTH[i]=TTH[i]-48;
          T.hour=TTH[0]*10+TTH[1];
          T.min= TTH[3]*10+TTH[4];
          T.sec= TTH[6]*10+TTH[7];
          Serial.print(T.hour);
          Serial.print("-");
          Serial.print(T.min);
          Serial.print("-");
          Serial.print(T.sec);
          Serial.println(" ");
          RTC.setTime(T.hour,T.min,T.sec);
          MelodyStart();
        }
        break;
      case 68: //D - set the date as format DD/MM/YYYY
        MON(100,100);
        for (int i=0; i<=9; i++){
          TTH[i]=(byte)Serial.read();
        }
        if (TTH[2]=='/' && TTH[5]=='/') {
          for (int i=0; i<=9; i++) Serial.print(char(TTH[i]));
          for (int i=0; i<=9; i++) TTH[i]=TTH[i]-48;
          Serial.println();
          T.date=TTH[0]*10+TTH[1];
          T.mon= TTH[3]*10+TTH[4];
          T.year= TTH[6]*1000+TTH[7]*100+TTH[8]*10+TTH[9];
          Serial.print(T.date);
          Serial.print("-");
          Serial.print(T.mon);
          Serial.print("-");
          Serial.print(T.year);
          Serial.println(" ");
          RTC.setDate(T.date,T.mon,T.year);
          MelodyStart();
        }
        break;
      
      default:
        Serial.println(iB,DEC);
    }
  }
  if (bitRead(PC,1) == 0 && oPC!=PC) {
    Mode++;
    itm=0;
    StoreSetup();
    tone(13,5000,50);
  }
  if (bitRead(PC,5) == 0 && oPC!=PC) { //ITM next
    //SPC_1=SPC_1_4;
    //SPC_2=SPC_2_4;
    switch(Mode){
      case 0: //time
        itm++;
        if (itm>2) itm=0;
        break;
      case 1: //date dm
        itm++;
        if (itm>2) itm=0;
        break;
      case 2: //date y
        itm++;
        if (itm>1) itm=0;
        break;
      case 8: //portsetup
        itm++;
        if (itm>1) itm=0;
        break;
    }
    tone(13,5000,50);
  }
  if (bitRead(PC,2) == 0 && oPC!=PC) { //ITM previouse
    //SPC_1=SPC_1_0;
    //SPC_2=SPC_2_0;
    switch(Mode){
      case 0: //time
        itm--;
        if (itm<0) itm=2;      
        break;
      case 1: //date
        itm--;
        if (itm<0) itm=2;      
        break;
      case 2: //date y
        itm--;
        if (itm<0) itm=1;
        break;
      case 8: //portsetup
        itm--;
        if (itm<0) itm=1;
        break;
    }
    tone(13,5000,50);
  }
  if (bitRead(PC,3)==0 && oPC!=PC) { //DATE LOWER
    switch(Mode){
      case 0: //time
        if (itm==1) { //hour -
          T=RTC.getTime();
          T.hour--;
          if (T.hour<0) T.hour=23;
          RTC.setTime(T.hour,T.min,T.sec);
        }
        if (itm==2) { //min --
          T=RTC.getTime();
          T.min--;
          if (T.min<0) T.min=59;
          RTC.setTime(T.hour,T.min,T.sec);
        }
    
        break;
      case 1: //date
        break;
      case 2: //dateyear
        if (itm==1) {
          T=RTC.getTime();
          T.year--;
          RTC.setDate(T.date,T.mon,T.year);
        }
        break;
      case 8: //portsetup
        if (bitRead(SETUP8,0)==0){
          bitWrite(SETUP8,0,1);
        }else{
          bitWrite(SETUP8,0,0);
        }
        InPort();
        StoreSetup();
        break;
    }
    tone(13,5000,50);
  }
  if (bitRead(PC,4)==0 && oPC!=PC) { //DATE UPPER
    switch(Mode){
      case 0: //time
        Serial.println(itm);
        if (itm==1) { //hour +
          T=RTC.getTime();
          T.hour++;
          if (T.hour>23) T.hour=0;
          RTC.setTime(T.hour,T.min,T.sec);
        }
        if (itm==2) { //min +
          T=RTC.getTime();
          T.min++;
          if (T.min>59) T.min=0;
          RTC.setTime(T.hour,T.min,T.sec);
        }
    
        break;
      case 1: //date
        break;
      case 2: //dateyear
        if (itm==1) {
          T=RTC.getTime();
          T.year++;
          RTC.setDate(T.date,T.mon,T.year);
        }
        break;
      case 8: //portsetup
        if (bitRead(SETUP8,0)==0){
          bitWrite(SETUP8,0,1);
        }else{
          bitWrite(SETUP8,0,0);
        }
        InPort();
        StoreSetup();
        break;
    }
    tone(13,5000,50);
  }
  if (bitRead(PC,0)==0) PORTB = PORTB | B00010000; else PORTB = PORTB & B11101111;
  oPC=PC;
  DYSPLAY();
}