saa1064-ds18x20-DS130
- Войдите на сайт для отправки комментариев
Уважаемые Гуру программного кода помогите пожалуйста!
Собрал в железе часы 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... Внес блокировки по питанию и экран на часики, но раз есть проблема - лучше прикрутить установку с кнопок...
Не понимаю почему, но код не вставляется :(
помогло простое копирование... а не для форума...
#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); }К сожалению здесь не крепятся библиотеки, а где я их брал , наверное, уже не смогу найти....
Первое, что приходит в голову, избавлятся от библиотеки DS1307 и делать на wire.
http://arrduinolab.blogspot.ru/2014/10/blog-post.html
Попробуйте, если разберетесь. Сам пока не юзал, но на будущее запомнил. Памяти я думаю под 1К высвободите.
Первое, что приходит в голову, избавлятся от библиотеки DS1307 и делать на wire.
уже ковыряю и выкидываю куски не используемые в моем случае - ака месяц, год и день недели... пока идет туго..
Первое, что приходит в голову, избавлятся от библиотеки DS1307 и делать на wire.
уже ковыряю и выкидываю куски не используемые в моем случае - ака месяц, год и день недели... пока идет туго..
Вы описание DS1307 хорошее поищите, том структуры команд приведены. Сразу проще станет.
Ну вот как-то вопрос решился, комменты в коде, кому интересно - используйте на свой страх и риск :)
там еще огромный плацдарм для оптимизации:
С delay() вы сильно погорячились. Их не просто много, а очень много. Почитайте http://arduino.ru/tutorials/BlinkWithoutDelay и попробуйте переделать под него. И вам руку набить, и код будет без рывков работать. Деление на десятки и единицы не оптимальнее делать перед выводом, а все арифметические операции проводить с целыми числами?
С 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() вы сильно погорячились. Их не просто много, а очень много. Почитайте 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сек станет грустно.
С delay() дело не в объемах памяти. Пока работает этот оператор, программа вообще ничего не делает, фактически висит. Пока это 1сек может и не заметно, когда наберется 20-30сек станет грустно.
Согласен, но в моем алгоритме так поступить мне было выгоднее - МК маленкий. millis требует операций инкримента или инкримента по условию, а это дополнительные переменные для хранения nextmillis в 4 байта и еще кучу прелестей типа переполнения через 50 дней или обнуление в конце цикла всех переменных (глобальных и локальных). Единственный жЫрный плюс - это проверка кнопки установки времени, других я не увидел.