saa1064-ds18x20-DS130

Гриша
Offline
Зарегистрирован: 27.04.2014

Уважаемые Гуру программного кода помогите пожалуйста!

Собрал в железе часы DS1307 на I2C, подцепил датчик температуры DS18B20 и все это отправлял на индикаторы  через SAA1064 на I2C - все работает. Проблема в установке часов с кнопок!!! А теперь по порядку:

ЦЕЛЬ: собрать часы с градусником  в ВЗГ  исполнении и подарить отцу на Новый Год, он живет в деревне, они на улице будут не лишние (железо собрано и работает, но нет установки времени с кнопок).

ИМЕЕТСЯ: платка с ATMEGA_8L ( 8Kbytes Flash, 0 - 8MHz (ATmega8L)),  на ней SAA1064 с индикаторами. К ним прикручены  DS1307 и DS18B20.

ПРОБЛЕМА: иногда, часики сбиваются и их нужно программировать.  Я написал отдельный скетч  для одной кнопки посимвольной установки  и понял, что если я их соединю - памяти не хватит. Уже давно в пути 328Р но к Новому году не поспеют!!!  Проблема №2 -очень немного понимаю как программировать, пользоваться операторами if  и  for немного могу (написал ведь), оператором switch case пока не могу :( не разобрался... и так еще много с чем...

ПРОСЬБА: сильно не ругать - это мой первый проект. Помогите соединить 2 скетча, чтоб хватило 7к памяти!

ЗЫ:   ATMEGA_8L - зашивал уже не раз через ARDUINO_UNO_R3... Внес блокировки по питанию и экран на часики, но раз есть проблема - лучше прикрутить установку с кнопок...

Гриша
Offline
Зарегистрирован: 27.04.2014

Не понимаю почему, но код не вставляется :(

помогло простое копирование... а не для форума...

#include <Wire.h>            // enable I2C bus
#include "DS1307.h"
#include <OneWire.h>
// Получаем температуру от датчиков серии DS18x20
// Поддерживаемые датчики
#define DS18S20_ID 0x10
#define DS18B20_ID 0x28
OneWire  ds(5);  // OneWire  ds(2); - Линия 1-Wire будет на pin 2
DS1307 clock;//define a object of DS1307 class
byte saa1064 = 0x70 >> 1; // define the I2C bus address for our SAA1064 (pin 1 to GND)
int digits[16]={63, 6, 91, 79, 102, 109, 125,7, 127, 111, 119, 124, 57, 94, 121, 113};
// these are the byte representations of pins required to display each digit 0~9 then A~F
int inpin1=6;// define digital interface #6
int inpin2=7;// define digital interface #7
void initDisplay()
// turns on dynamic mode and adjusts segment current to 12mA
{
 Wire.beginTransmission(saa1064);
 Wire.write(B00000000); // this is the instruction byte. Zero means the next byte is the control byte
 Wire.write(B01000111); // control byte (dynamic mode on, digits 1+3 on, digits 2+4 on, 12mA segment current (B01000111), 
                        // 6mA segment current (B00100111), 03mA segment current (B00010111),
 Wire.endTransmission();
 delay(1000);
}
void setup()
{
//      Serial.begin(9600);
      Wire.begin(); // start up I2C bus
      delay(1000);
      initDisplay();
      delay(1000);
      clock.begin();
      delay(1000);
}

void displayDigits1()
 {
  clock.getTime(); 
 Wire.beginTransmission(saa1064);
 Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
 Wire.write(digits[(clock.hour)%10]+128);   //d2
 Wire.write(digits[(clock.minute)/10]); //d3
 Wire.write(digits[(clock.minute)%10]); //d4
 Wire.write(digits[(clock.hour)/10]); //d1
 Wire.endTransmission(); 
// delay(1000);
 }
 
void displayDigits2()
 {
  clock.getTime(); 
 Wire.beginTransmission(saa1064);
 Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
 Wire.write(digits[(clock.hour)%10]);   //d2
 Wire.write(digits[(clock.minute)/10]); //d3
 Wire.write(digits[(clock.minute)%10]); //d4
 Wire.write(digits[(clock.hour)/10]); //d1
 Wire.endTransmission(); 
// delay(1000);
 } 
 
void Temperature()
{
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  
  if (!ds.search(addr)) 
  {
      ds.reset_search();
      return;
  }
  
  if (OneWire::crc8( addr, 7) != addr[7]) 
  {
//      Serial.print("CRC is not valid!\n");
      return;
  }
  
  if (addr[0] != DS18S20_ID && addr[0] != DS18B20_ID) 
  {
//      Serial.print("Device is not a DS18x20 family device.\n");
      return;
  }
  
  ds.reset();
  ds.select(addr);
  
  ds.write(0x44, 1);    // Запускаем конвертацию
   
  delay(1000);   // Подождем...
  
  present = ds.reset();
  ds.select(addr); 

  ds.write(0xBE);    // Считываем ОЗУ датчика  

   // Обрабатываем 9 байт
  for ( i = 0; i < 9; i++) 
  {
    data[i] = ds.read();
  }
  
  // Высчитываем температуру :)
  int HighByte, LowByte, TReading, Tc_100, SignBit, Whole, Fract;
  LowByte = data[0];
  HighByte = data[1];

   TReading = (HighByte << 8) + LowByte;
   
   // Проверяем дубак там или нет
   SignBit = TReading & 0x8000; 
   
   // Если на улице дубак :)
   if (SignBit) 
   { 
       TReading = (TReading ^ 0xffff) + 1; 
   }
   
   // Умножаем на (100 * 0.0625) или 6.25
   Tc_100 = (6 * TReading) + TReading / 4;

   // Отделяем целые от дробных чисел
   Whole = Tc_100 / 100;
   Fract = Tc_100 % 100;
int k;
if (SignBit) 
   { 
      k=64;
   }
   else
   {
     k=88;
   } 
{   
Wire.beginTransmission(saa1064);
 Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
 Wire.write(digits[(Whole)/10]);   //d2   (digits[(clock.hour)%10]+128);   //d2
 Wire.write(digits[(Whole)%10]+128); //d3
 Wire.write(digits[(Fract)/10]); //d4
 //  int digits[16]={63, 6, 91, 79, 102, 109, 125,7, 127, 111, 119, 124, 57, 94, 121, 113};
 Wire.write(k); //d1
 Wire.endTransmission();    
 delay(6000);
}   
} 

   
void loop()
{
// delay(100);
  Temperature();
// delay(100);
 
 int l;
 for (l=0; l<=5; l++)
 {
  displayDigits1();
 delay(500); 
 displayDigits2();
 delay(500); 
 }

}
/*
установка времени в DS1307 с помощью одной кнопки и монитора порта - работает;
установка времени поразрядно, для входа в режим - держи кнопку.
DS1307 - подключен к i2c (IIC), кнопка к выводу D6 на землю, 10к резистор к D6 на +5В;
главная проблема - вес скетча!!! ;
кому нечего делать может прицепить диоды :)  ;
*/
#include <Wire.h>            // enable I2C bus
#include "DS1307.h"
DS1307 clock;//define a object of DS1307 class

int inpin1=6;// define digital interface #6
//int inpin2=7;// define digital interface #7
int led1=8, led2=9, led3=10, led4=11, led5=12, led6=13;
//int f, g;

void setup()
{     
      Serial.begin(9600);
      Wire.begin(); // start up I2C bus
      delay(1000);
      clock.begin();
      delay(1000);
      pinMode(inpin1,INPUT);//define button interface as input для разрядов и входа в режим програмирования
//      pinMode(inpin2,INPUT);//define button interface as input для установки чисел в разрядах
      pinMode(led1,OUTPUT);//define button interface as OUTput
      pinMode(led2,OUTPUT);//define button interface as OUTput
      pinMode(led3,OUTPUT);//define button interface as OUTput
      pinMode(led4,OUTPUT);//define button interface as OUTput
      pinMode(led5,OUTPUT);//define button interface as OUTput
      pinMode(led6,OUTPUT);//define button interface as OUTput
      
}
void set2Time()
{    //+1
         //int inpin1=6;// define digital interface #6 | int inpin2=7;// define digital interface #7
  int x, y, y2;  //  zset,
  int HD, HS, MD, MS;
  int HDs, HSs, MDs, MSs;
//  zset = digitalRead(inpin1);   // read the state of the pushbutton value for set time process:
  
  if(digitalRead(inpin1)==LOW) //test if the button 1 been pushed
  {     //+2
     for(x=0; x<=2; x++)                  //test 3-5 times for begin set time process  --- for 1 begin
     {      ///+3
         delay (500);
//         zset = digitalRead(inpin1);
         if(digitalRead(inpin1)==LOW)
         {
/*           digitalWrite(led2,LOW);
           delay (200);
           digitalWrite(led2,HIGH);
           delay (200);
           digitalWrite(led2,LOW); */
//           delay (800);         
         }
         else 
         {
         goto stopset;
         }  
     }        ////-3                        ////  for 1 and

   clock.getTime();
   HD=(clock.hour)/10;
   HS=(clock.hour)%10;
   MD=(clock.minute)/10;
   MS=(clock.minute)%10;
   HDs=HD;   //десятки часа
   HSs=HS;   // единицы часа
   MDs=MD;   //десятки минут
   MSs=MS;   // единицы минут
/*   Serial.print(HD);
   Serial.print(HS);
   Serial.print(":");
   Serial.print(MD);
   Serial.print(MS);   
   Serial.print("\n");  
   delay(1000);    */
   
        for(x=0; x<=6; x++)             //ready for set  HD     for 2 begin
        {    //+4
          
          Serial.print("D1:_");  
          Serial.print(HDs);
          Serial.print(HSs);
          Serial.print(":");
          Serial.print(MDs);
          Serial.print(MSs);   
          Serial.print("\n");
          digitalWrite(led3,HIGH);
          delay (500);
          digitalWrite(led3,LOW);
          delay (500);          
//          zset = digitalRead(inpin1);
              if(digitalRead(inpin1)==LOW)
              {  //+5
              digitalWrite(led4,LOW);
              delay (400);
              digitalWrite(led4,HIGH);
              delay (400); 
              digitalWrite(led4,LOW);
              delay (400);
              x=0;
           
                   if (HDs<3) 
                    { 
                     y=HDs++ ; 
/*                     Serial.print("+-+-");      
                     Serial.print(HDs);
                     Serial.print(HSs);
                     Serial.print(":");
                     Serial.print(MDs);
                     Serial.print(MSs);   
                     Serial.print("\n");   */
                    }
                    if (HDs>=3) 
                    { 
                     y=0;
                     HDs=y;
/*                     Serial.print("----");      
                     Serial.print(HDs);
                     Serial.print(HSs);
                     Serial.print(":");
                     Serial.print(MDs);
                     Serial.print(MSs);   
                     Serial.print("\n");   */
                    }
              y=HDs;
/*              Serial.print("+++");      
              Serial.print(HDs);
              Serial.print(HSs);
              Serial.print(":");
              Serial.print(MDs);
              Serial.print(MSs);   
              Serial.print("\n");    */
              }   //-5
       
     }    //-4                              // and for 2   
     
             Serial.print("SET_D1_and_ ");      
              Serial.print(HDs);
              Serial.print(HSs);
              Serial.print(":");
              Serial.print(MDs);
              Serial.print(MSs);   
              Serial.print("\n");   
              delay (100);

     
     for(x=0; x<=6; x++)             //ready for set  HS     for 3 begin
        {    //+4
/*          digitalWrite(led3,LOW);
          delay (300);
          digitalWrite(led3,HIGH);
          delay (300);
          digitalWrite(led3,LOW);  */
          Serial.print("D2:_");
          Serial.print(HDs);
          Serial.print(HSs);
          Serial.print(":");
          Serial.print(MDs);
          Serial.print(MSs);   
          Serial.print("\n");   
          delay (1200);         
//          zset = digitalRead(inpin1);
              if(digitalRead(inpin1)==LOW)
              {  //+5
/*              digitalWrite(led4,HIGH);
              delay (400);
              digitalWrite(led4,LOW);
              delay (400);
              digitalWrite(led4,HIGH);
              delay (400); 
              digitalWrite(led4,LOW);   */
//              delay (800);
              x=0;
                  
                   if (HDs==2) 
                    { 
                       if (HSs<4)
                        {
                        y2=HSs++ ; 
/*                        Serial.print("D2_HSs+-");      
                        Serial.print(HDs);
                        Serial.print(HSs);
                        Serial.print(":");
                        Serial.print(MDs);
                        Serial.print(MSs);   
                        Serial.print("\n");  */
                        y2=HSs;   
                       }
                       
                       if (y2>=4) 
                       { 
/*                        Serial.print("D2_HSs+-+-+-+-");      
                        Serial.print(HDs);
                        Serial.print(HSs);
                        Serial.print(":");
                        Serial.print(MDs);
                        Serial.print(MSs);   
                        Serial.print("\n");    */
                        y2=0;
                        HSs=y2;
/*                         Serial.print("+-+-000--");      
                         Serial.print(HDs);
                         Serial.print(HSs);
                         Serial.print(":");
                         Serial.print(MDs);
                         Serial.print(MSs);   
                         Serial.print("\n");   */
                       }
                    }
                    if (HDs<2) 
                    { 
                       if (HSs<10)
                        {
                        y2=HSs++ ; 
                        y2=HSs;
 /*                       Serial.print("+-+- HDs<2_HSs<10_");      
                        Serial.print(HDs);
                        Serial.print(HSs);
                        Serial.print(":");
                        Serial.print(MDs);
                        Serial.print(MSs);   
                        Serial.print("\n");   */
                       }
                       if (HSs>=10) 
                       { 
                        y2=0;
                        HSs=y2;
 /*                       Serial.print("+-+-HSs>=10_y2=0_");      
                         Serial.print(HDs);
                         Serial.print(HSs);
                         Serial.print(":");
                         Serial.print(MDs);
                         Serial.print(MSs);   
                         Serial.print("\n");   */
                       }
                    }

/*              Serial.print("+++");      
              Serial.print(HDs);
              Serial.print(HSs);
              Serial.print(":");
              Serial.print(MDs);
              Serial.print(MSs);   
              Serial.print("\n");    */
              }   //-5
       
     }    //-4                              // and for 3   
     
              Serial.print("SET_D2_and_ ");      
              Serial.print(HDs);
              Serial.print(HSs);
              Serial.print(":");
              Serial.print(MDs);
              Serial.print(MSs);   
              Serial.print("\n");   
              delay (100);
     
     for(x=0; x<=6; x++)             //ready for set  MD     for 4 begin
        {    //+4
/*          digitalWrite(led3,LOW);
          delay (300);
          digitalWrite(led3,HIGH);
          delay (300);
          digitalWrite(led3,LOW);   */
          Serial.print("D3:_");
          Serial.print(HDs);
          Serial.print(HSs);
          Serial.print(":");
          Serial.print(MDs);
          Serial.print(MSs);   
          Serial.print("\n"); 
          delay (1200);           
//          zset = digitalRead(inpin1);
              if(digitalRead(inpin1)==LOW)
              {  //+5
/*              digitalWrite(led4,HIGH);
              delay (400);
              digitalWrite(led4,LOW);
              delay (400);
              digitalWrite(led4,HIGH);
              delay (400); 
              digitalWrite(led4,LOW);  */
              delay (800);
              x=0;
 //---------------------------------------------------------------------------                 

                        if (MDs<6)
                        {
                        y2=MDs++ ; 
                        y2=MDs;
/*                        Serial.print("+-+- MDs<6_");      
                        Serial.print(HDs);
                        Serial.print(HSs);
                        Serial.print(":");
                        Serial.print(MDs);
                        Serial.print(MSs);   
                        Serial.print("\n");   */
                       }
                       if (MDs>=6) 
                       { 
                        y2=0;
                        MDs=y2;
/*                        Serial.print("+-+-MDs>=6_y2=0_");      
                         Serial.print(HDs);
                         Serial.print(HSs);
                         Serial.print(":");
                         Serial.print(MDs);
                         Serial.print(MSs);   
                         Serial.print("\n");   */
                       }
//----------------------------------------------------------------------                  

/*              Serial.print("+++");      
              Serial.print(HDs);
              Serial.print(HSs);
              Serial.print(":");
              Serial.print(MDs);
              Serial.print(MSs);   
              Serial.print("\n");    */
              }   //-5
       
     }    //-4                         set  MD   and  of for 4    
   
              Serial.print("SET_D3_and_ ");      
              Serial.print(HDs);
              Serial.print(HSs);
              Serial.print(":");
              Serial.print(MDs);
              Serial.print(MSs);   
              Serial.print("\n");   
              delay (100);
     
     
          for(x=0; x<=6; x++)             //ready for set  MS     for 5 begin
        {    //+4
/*          digitalWrite(led3,LOW);
          delay (300);
          digitalWrite(led3,HIGH);
          delay (300);
          digitalWrite(led3,LOW);  */
          Serial.print("D4:_");
          Serial.print(HDs);
          Serial.print(HSs);
          Serial.print(":");
          Serial.print(MDs);
          Serial.print(MSs);   
          Serial.print("\n"); 
          delay (1200);           
//          zset = digitalRead(inpin1);
              if(digitalRead(inpin1)==LOW)
              {  //+5
/*              digitalWrite(led4,HIGH);
              delay (400);
              digitalWrite(led4,LOW);
              delay (400);
              digitalWrite(led4,HIGH);
              delay (400); 
              digitalWrite(led4,LOW);   */
//              delay (800);
              x=0;
 //---------------------------------------------------------------------------                 

                        if (MSs<10)
                        {
                        y2=MSs++ ; 
                        y2=MSs;
/*                        Serial.print("+-+- MSs<10_");      
                        Serial.print(HDs);
                        Serial.print(HSs);
                        Serial.print(":");
                        Serial.print(MDs);
                        Serial.print(MSs);   
                        Serial.print("\n");   */
                       }
                       if (MSs>=10) 
                       { 
                        y2=0;
                        MSs=y2;
/*                        Serial.print("+-+-MSs>=10_y2=0_");      
                         Serial.print(HDs);
                         Serial.print(HSs);
                         Serial.print(":");
                         Serial.print(MDs);
                         Serial.print(MSs);   
                         Serial.print("\n");   */
                       }
//----------------------------------------------------------------------                  

/*              Serial.print("+D5++");      
              Serial.print(HDs);
              Serial.print(HSs);
              Serial.print(":");
              Serial.print(MDs);
              Serial.print(MSs);   
              Serial.print("\n");    */
              }   //-5
       
     }    //-4                         set  MS   and of for 5       

              Serial.print("SET_D4_and_ ");      
              Serial.print(HDs);
              Serial.print(HSs);
              Serial.print(":");
              Serial.print(MDs);
              Serial.print(MSs);   
              Serial.print("\n");   
              delay (1200); 
//---------------------write to DS1307
            HD=(HDs*10+HSs);
            if (HD>=24) //защита от кривых рук :)
            { HD=0; }
            MD=(MDs*10+MSs);
            if (MD>=60) //защита от кривых рук :)
            { MD=0; }
/*            Serial.print(HD, DEC);
            Serial.print(":");
            Serial.print(MD, DEC);
            Serial.print("\n");  
            delay(1000);     */
            
            clock.fillByHMS(HD,MD,30);
            clock.setTime();

/*{
	Serial.begin(9600);
	clock.begin();
	clock.fillByYMD(2014,11,26);// (2013,1,19) Jan 19,2013  
	clock.fillByHMS(19,50,30);// (15,28,30) 15:28 30"
	clock.fillDayOfWeek(TUE);// (SAT) Saturday
	clock.setTime();//write time to the RTC chip 
//комент на 4 строки для установки вренени и даты
} */

//------------------------------------------------
              
              
    
    
  }  //-2
 stopset: ;
}   //-1

void loop()
{
 int l;
 for (l=0; l<=2; l++)
 {
   clock.getTime();
   Serial.print(clock.hour, DEC);
   Serial.print(":");
   Serial.print(clock.minute, DEC);
   Serial.print("\n");  
   delay(1000); 
  
 }
  set2Time();
  digitalWrite(led1,HIGH);
  delay (400); 
  digitalWrite(led1,LOW);
  delay (400);
}

 

 

 

Гриша
Offline
Зарегистрирован: 27.04.2014

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

bwn
Offline
Зарегистрирован: 25.08.2014

Первое, что приходит в голову, избавлятся от библиотеки DS1307 и делать на wire.

http://arrduinolab.blogspot.ru/2014/10/blog-post.html

Попробуйте, если разберетесь. Сам пока не юзал, но на будущее запомнил. Памяти я думаю под 1К высвободите.

Гриша
Offline
Зарегистрирован: 27.04.2014

bwn пишет:

Первое, что приходит в голову, избавлятся от библиотеки DS1307 и делать на wire.

уже ковыряю и выкидываю куски не используемые в моем случае - ака месяц, год и день недели... пока идет туго..

bwn
Offline
Зарегистрирован: 25.08.2014

Гриша пишет:

bwn пишет:

Первое, что приходит в голову, избавлятся от библиотеки DS1307 и делать на wire.

уже ковыряю и выкидываю куски не используемые в моем случае - ака месяц, год и день недели... пока идет туго..

Вы описание DS1307 хорошее поищите, том структуры команд приведены. Сразу проще станет.

Гриша
Offline
Зарегистрирован: 27.04.2014

Ну вот как-то вопрос решился, комменты в коде, кому интересно - используйте на свой страх и риск :) 

там еще огромный плацдарм для оптимизации:

//   Типа мой первый проек :) для сэбэ
//   часы с градусником для 8MHz (ATmega8L)
//   в железе:
//   DS1307, saa1064, DS18B20, контроллер с  ARDUINO
//   связь по: IIC (ака I2C, Wire) и OneWire
//   одна кнопка для установки часиков
//   огромное спасибо:
//   http://robocraft.ru/blog/arduino/136.html
//   http://www.hackmeister.dk/2011/01/new-bootloader-file-for-atmega8l/
/*
 Example 39.1 - NXP SAA1064 I2C LED Driver IC Demo I
 Demonstrating display of digits
 http://tronixstuff.com/tutorials > chapter 39
 */
//http://devicter.ru/goods/modul-rtc
//
//

#include <Wire.h>            // enable I2C bus
#include "DS1307.h"
#include <OneWire.h>
OneWire  ds(5);  // OneWire  ds(2); - Линия 1-Wire будет на pin 2
DS1307 clock;//define a object of DS1307 class
// глобальные переменные
  byte saa1064 = 0x70 >> 1; // define the I2C bus address for our SAA1064 (pin 1 to GND)
  int digits[16]={63, 6, 91, 79, 102, 109, 125,7, 127, 111, 119, 124, 57, 94, 121, 113};
  // these are the byte representations of pins required to display each digit 0~9 then A~F
  int k; // знак температуры
  // ниже куча переменных, возможно, можно и меньше сделать
  int x, y, y2;  
  int HD, HS, MD, MS;  // переменные для каждого знака часов и минут
  int HDs, HSs, MDs, MSs; // тоже нужно
  int inpin1=6;// define digital interface #6 for set time - типа кнопка тут

void delay1000 ()  // попробуем заменить все задержки в 1 сек
{ delay (1000); }   // !!!!!!!!!!!!for delay = 1s do not modify !!!!!!
void initDisplay()
// turns on dynamic mode and adjusts segment current to 12mA
{
 Wire.beginTransmission(saa1064);
 Wire.write(B00000000); // this is the instruction byte. Zero means the next byte is the control byte
 Wire.write(B01000111); // control byte (dynamic mode on, digits 1+3 on, digits 2+4 on, 12mA segment current (B01000111), 
                        // 6mA segment current (B00100111), 03mA segment current (B00010111),
 Wire.endTransmission();
 delay1000 ();
}
void setup()
{
//      Serial.begin(9600);   // использовал на стадии дебага - ниже удалил все следы
      Wire.begin(); // start up I2C bus
      delay1000 ();
      initDisplay(); // смотри выше, все написано
      delay1000 ();
      clock.begin();  // угадай, зачем
      delay1000 ();
}
void get2time ()  // вытаскиваем часы посимвольно из RTC 
{
       clock.getTime();
       HD=(clock.hour)/10;
       HS=(clock.hour)%10;
       MD=(clock.minute)/10;
       MS=(clock.minute)%10;
       HDs=HD;   //десятки часа
       HSs=HS;   // единицы часа
       MDs=MD;   //десятки минут
       MSs=MS;   // единицы минут       
}
//---------------displayDigits   get2time-----------------------------------------------------

void displayDigits1()
 {
  get2time (); 
 Wire.beginTransmission(saa1064);
 Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
 Wire.write(digits[(HS)]+128);   //d2
 Wire.write(digits[(MD)]); //d3
 Wire.write(digits[(MS)]); //d4
 Wire.write(digits[(HD)]); //d1
 Wire.endTransmission(); 
 delay1000 ();
 Wire.beginTransmission(saa1064);
 Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
 Wire.write(digits[(HS)]);   //d2
 Wire.write(digits[(MD)]); //d3
 Wire.write(digits[(MS)]); //d4
 Wire.write(digits[(HD)]); //d1
 Wire.endTransmission(); 
 delay1000 ();
 }
 
//---------------displayDigits   set2Time-------------------------------------------

            // 1

void displayDigits1s()  // типа символы програмирования часов
 {
 Wire.beginTransmission(saa1064);
 Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
 Wire.write(88+128);   //d2
 Wire.write(88); //d3
 Wire.write(88); //d4
 Wire.write(88); //d1
 Wire.endTransmission();
 delay1000 (); 
 }
void displayDigits2s()  // смотреть чего установим в часики
 {
 Wire.beginTransmission(saa1064);
 Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
 Wire.write(digits[(HSs)]);   //d2
 Wire.write(digits[(MDs)]); //d3
 Wire.write(digits[(MSs)]); //d4
 Wire.write(digits[(HDs)]); //d1
 Wire.endTransmission(); 
 delay1000 ();
 } 
//----------------------------------------------------------------------------------
void set2Time()
{    //+1        
  
  if(digitalRead(inpin1)==LOW) //test if the button 1 been pushed for set time process:
  {     //+2
     for(x=0; x<=2; x++)                  //test 3-5 times for begin set time process  --- for 1 begin
     {      ///+3
         delay (500);
         
         if(digitalRead(inpin1)==LOW)  // можно заменить на != и все станет проще, но уже мне не важно
         {
           
         }
         else 
         {
         goto stopset;
         }  
     }        ////-3                        ////  for 1 and
 
        get2time ();
        displayDigits1s(); // указатель входа в програмирование часов
   
        for(x=0; x<=6; x++)             //ready for set  HD     for 2 begin
        {    //+4
          
          
          displayDigits2s(); // готовы програмировать Д1 

              if(digitalRead(inpin1)==LOW)
              {  //+5
              delay1000 ();
              x=0;
           
                   if (HDs<3) 
                    { 
                     y=HDs++ ; 
                    }
                    if (HDs>=3) 
                    { 
                     y=0;
                     HDs=y;
                    }
              y=HDs;
              }   //-5
       
     }    //-4                              // and for 2   
     
       // закончили програмировать Д1
              displayDigits1s(); 

     
     for(x=0; x<=6; x++)             //ready for set  HS     for 3 begin
        {    //+4
          
          displayDigits2s(); // готовы програмировать Д2

              if(digitalRead(inpin1)==LOW)
              {  //+5

              x=0;   // обнулим for чтоб не тупила установка с кнопок
              
              // проверяем, десятки часа 
                  
                   if (HDs==2) 
                    { 
                       if (HSs<4)
                        {
                        y2=HSs++ ; 
                        y2=HSs;   
                       }
                       
                       if (y2>=4) 
                       { 
                        y2=0;
                        HSs=y2;
                       }
                    }
                    if (HDs<2) 
                    { 
                       if (HSs<10)
                        {
                        y2=HSs++ ; 
                        y2=HSs;
                       }
                       if (HSs>=10) 
                       { 
                        y2=0;
                        HSs=y2;
                       }
                    }

              }   //-5
       
     }    //-4                              // and for 3   
     
              displayDigits1s();  //  "SET_D2_and_ "
              
     
     for(x=0; x<=6; x++)             //ready for set  MD     for 4 begin
        {    //+4

            displayDigits2s();

              if(digitalRead(inpin1)==LOW)
              {  //+5
              delay (800);   // можно удалить, наверное 
              x=0;
 //---------------------------------------------------------------------------                 

                        if (MDs<6) //минут < 60
                        {
                        y2=MDs++ ; 
                        y2=MDs;
                       }
                       if (MDs>=6) 
                       { 
                        y2=0;
                        MDs=y2;
                       }
//----------------------------------------------------------------------                  

              }   //-5
       
     }    //-4                         set  MD   and  of for 4    
   
              displayDigits1s();
    
          for(x=0; x<=6; x++)             //ready for set  MS     for 5 begin
        {    //+4

            displayDigits2s();  // готовы програмировать Д4
          
              if(digitalRead(inpin1)==LOW)
              {  //+5

              x=0;
 //---------------------------------------------------------------------------                 

                        if (MSs<10)
                        {
                        y2=MSs++ ; 
                        y2=MSs;
                       }
                       if (MSs>=10) 
                       { 
                        y2=0;
                        MSs=y2;
                       }
//----------------------------------------------------------------------                  

              }   //-5
       
     }    //-4                         set  MS ,  and of for 5       

 
             displayDigits1s();   // готово   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
              
//---------------------write to DS1307
            HD=(HDs*10+HSs);
            if (HD>=24) //защита от кривых рук :)
            { HD=0; }
            MD=(MDs*10+MSs);
            if (MD>=60) //защита от кривых рук :)
            { MD=0; }

            clock.fillByHMS(HD,MD,30);
            clock.setTime();

//------------------------------------------------

  }  //-2
 stopset: ;   // точка выхода, если кнопка не нажата 3 сек
}   //-1

//-------------типа получаем температуру, дебаги отключены (Serial.print)------------


void Temperature()
{
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  
  if (!ds.search(addr)) 
  {
      ds.reset_search();
      return;
  }
  
  if (OneWire::crc8( addr, 7) != addr[7]) 
  {
//      Serial.print("CRC is not valid!\n");
      return;
  }
  
//  if (addr[0] != DS18S20_ID && addr[0] != DS18B20_ID)
  if (addr[0] != 0x28)
  {
//      Serial.print("Device is not a DS18x20 family device.\n");
      return;
  }
  
  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);    // Запускаем конвертацию
  delay1000 ();   // Подождем...
  
  present = ds.reset();
  ds.select(addr); 
  ds.write(0xBE);    // Считываем ОЗУ датчика  

   // Обрабатываем 9 байт
  for ( i = 0; i < 9; i++) 
  {
    data[i] = ds.read();
  }
  
  // Высчитываем температуру :)
  int HighByte, LowByte, TReading, Tc_100, SignBit, Whole, Fract;
  LowByte = data[0];
  HighByte = data[1];

   TReading = (HighByte << 8) + LowByte;
   SignBit = TReading & 0x8000; // Проверяем дубак там или нет
   
   // Если на улице дубак :)
   if (SignBit) 
   { 
       TReading = (TReading ^ 0xffff) + 1; 
   }
   Tc_100 = (6 * TReading) + TReading / 4;    // Умножаем на (100 * 0.0625) или 6.25

   // Отделяем целые от дробных чисел
   Whole = Tc_100 / 100;
   Fract = Tc_100 % 100;

if (SignBit) 
   { 
     k=64;
   }
   else
   {
     k=88;
   } 
{   
Wire.beginTransmission(saa1064);
 Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
 Wire.write(digits[(Whole)/10]);   //d2   (digits[(clock.hour)%10]+128);   //d2
 Wire.write(digits[(Whole)%10]+128); //d3
 Wire.write(digits[(Fract)/10]); //d4
 Wire.write(k); //d1     // знак  температуры "с" если +, "-" если <0 
 Wire.endTransmission();    
 delay(6000);
}   
} 

   
void loop()
{
  Temperature();
 delay1000 ();
 set2Time();
 
 int l;  // локальная переменная - можно заменить на "х" (глобальную)
 for (l=0; l<=3; l++)
 {
  displayDigits1();
 }

}

 

bwn
Offline
Зарегистрирован: 25.08.2014

С delay() вы сильно погорячились. Их не просто много, а очень много. Почитайте http://arduino.ru/tutorials/BlinkWithoutDelay и попробуйте переделать под него. И вам руку набить, и код будет без рывков работать. Деление на десятки и единицы не оптимальнее делать перед выводом, а все арифметические операции проводить с целыми числами?

Гриша
Offline
Зарегистрирован: 27.04.2014

bwn пишет:

С delay() вы сильно погорячились. Их не просто много, а очень много. Почитайте http://arduino.ru/tutorials/BlinkWithoutDelay и попробуйте переделать под него. И вам руку набить, и код будет без рывков работать. Деление на десятки и единицы не оптимальнее делать перед выводом, а все арифметические операции проводить с целыми числами?

Спасибо за совет. Понимаю, что код пока не мой конек :) . delay (i) кушает 8 байт, подпрограмма delay (), которая обращается к delay (1000), кушает 2 байта, в этом моменте я возможно выиграл место (смотреть нужно, не уверен). unsigned long currentMillis = millis();несомненно съест больше. По поводу деления на единицы и десятки могу сказать одно, мне нужно было отправить 4 байта символов последовательно, причем каждому числу соотнести его код отображения на индикаторах (digits[16]={63, 6, ..., 113};) - сделал так как понимаю это в данный момент. Строки с 060 по 063 конечно же написаны с ошибкой, но это я сейчас только понял, хотя это не повлияло на конечный результат (мне немного повезло), должен был везде поставить %10. Несомненно char и byte сократили бы мне вес кода - это тоже еще нужно мне обдумывать, где и что использовать.
ЗЫ подарок уже отправлен, может и будет время его подправить, но не в этот раз. Сейчас я "ваяю" второй "шедевр" на AD22100 st зацепив его на А1, тут у меня времени немного побольше, вот и потренируюсь...
 

bwn
Offline
Зарегистрирован: 25.08.2014

Гриша пишет:

bwn пишет:

С delay() вы сильно погорячились. Их не просто много, а очень много. Почитайте http://arduino.ru/tutorials/BlinkWithoutDelay и попробуйте переделать под него. И вам руку набить, и код будет без рывков работать. Деление на десятки и единицы не оптимальнее делать перед выводом, а все арифметические операции проводить с целыми числами?

Спасибо за совет. Понимаю, что код пока не мой конек :) . delay (i) кушает 8 байт, подпрограмма delay (), которая обращается к delay (1000), кушает 2 байта, в этом моменте я возможно выиграл место (смотреть нужно, не уверен). unsigned long currentMillis = millis();несомненно съест больше. По поводу деления на единицы и десятки могу сказать одно, мне нужно было отправить 4 байта символов последовательно, причем каждому числу соотнести его код отображения на индикаторах (digits[16]={63, 6, ..., 113};) - сделал так как понимаю это в данный момент. Строки с 060 по 063 конечно же написаны с ошибкой, но это я сейчас только понял, хотя это не повлияло на конечный результат (мне немного повезло), должен был везде поставить %10. Несомненно char и byte сократили бы мне вес кода - это тоже еще нужно мне обдумывать, где и что использовать.
ЗЫ подарок уже отправлен, может и будет время его подправить, но не в этот раз. Сейчас я "ваяю" второй "шедевр" на AD22100 st зацепив его на А1, тут у меня времени немного побольше, вот и потренируюсь...
 

С delay() дело не в объемах памяти. Пока работает этот оператор, программа вообще ничего не делает, фактически висит. Пока это 1сек может и не заметно, когда наберется 20-30сек станет грустно.

Гриша
Offline
Зарегистрирован: 27.04.2014

bwn пишет:

С delay() дело не в объемах памяти. Пока работает этот оператор, программа вообще ничего не делает, фактически висит. Пока это 1сек может и не заметно, когда наберется 20-30сек станет грустно.

Согласен, но в моем алгоритме так поступить мне было выгоднее - МК маленкий. millis  требует операций инкримента или инкримента по условию, а это дополнительные переменные для хранения nextmillis в 4 байта и еще кучу прелестей типа переполнения через 50 дней или обнуление в конце цикла всех переменных (глобальных и локальных). Единственный жЫрный плюс - это проверка кнопки установки времени, других я не увидел.