Часы DS1307
- Войдите на сайт для отправки комментариев
Втр, 05/07/2016 - 22:36
Помогите найти баг скетча или что там происходит.Не выводит время (дс1307).Градус работает. На индикаторе 01.01 Даже выдернуть провода-тоже самое.Значит нет сигнала от датчика.Как На этом сайте выставил время(через порт),ниче не трогал,залил скетч этот все равно 01.01 А еще бы добавить две кнопки для выставления времени.
http://zelectro.cc/RTC_DS1307_arduino
// Термометр и часы на 7-сегментном дисплее на 595 (динамическая индикация)
// пины для подключения экрана
#define SCLK 12
#define RCLK 11
#define DIO 10
// Пин термодатчика
#define DS18x20 9
// Буфер для хранения значений знакомест
byte digit[4]; // буфер значений знакомест
// Часы
#include <iarduino_RTC.h>
//iarduino_RTC time(RTC_DS3231);
iarduino_RTC time(RTC_DS1307);
//iarduino_RTC time(RTC_DS1302,10,13,12); //10 13 12 - выводы rst, clk, dat
int point = HIGH; // состояние точки в часах (для мигания каждую секунду)
long pointmillis = 0;
#include <OneWire.h>
OneWire ds(DS18x20);
float Temp; // Температура
byte type_s = 0; // Тип датчика
byte present = 0;
byte data[12];
byte addr[8];
int ct = HIGH; //переключатель часы-температура
long ctmillis = 0; //счетчик для переключателя часы-температура
long cpause = 25000; // каждые 25 сек...
long tpause = 5000; // включаем градусник на 5 сек
long PMillis = 0;
long PPause = 750; // пауза на датчике для протокола опроса датчиков температуры (минимум 750)
char dbuffer [6]; // буффер для теста - будем в него писать значения
void setup(void)
{
pinMode(RCLK, OUTPUT);
pinMode(SCLK, OUTPUT);
pinMode(DIO, OUTPUT);
if ( !ds.search(addr)) { // Ищем датчик
ds.reset_search();
dbuffer [0] = 'E';
dbuffer [1] = 'R';
dbuffer [2] = 'R';
dbuffer [3] = '1'; //ошибка поиска датчика
led7print(dbuffer);
type_s = 99; // датчик не найден
}
// the first ROM byte indicates which chip
switch (addr[0]) {
case 0x10:
// Serial.println(" Chip = DS18S20"); // or old DS1820
type_s = 1;
break;
case 0x28:
// Serial.println(" Chip = DS18B20");
type_s = 0;
break;
case 0x22:
// Serial.println(" Chip = DS1822");
type_s = 0;
break;
default:
// Serial.println("Device is not a DS18x20 family device.");
dbuffer [0] = 'E';
dbuffer [1] = 'R';
dbuffer [2] = 'R';
dbuffer [3] = '2'; //ошибка определения типа датчика
led7print(dbuffer);
type_s = 99; //ошибка в типе датчика
}
time.begin();
time.period(1);
//Установка времени - один раз если в RTC есть батврейка.
time.settime(0,18,21,3,7,16,0); // 0 сек, 18 мин, 21 час, 3, июля, 2016 года, воскресенье
pointmillis = millis();
}
void loop(void)
{
// мигание точки в часах
if (millis()>=pointmillis) {point = !point; pointmillis = pointmillis + 1000;} //раз в секунду меняем точку на не точку
if (millis() > ctmillis) {
ct = !ct; // переключаемся с часов на температуру
if (ct) { ctmillis = millis() + cpause;} // переключились на часы - просто запоминаем время для следующего переключения
else {
// и если датчик был обнаружили
if (type_s != 99 ) {
// работа с датчиком - стырено отовсюду
byte i;
ds.reset();
ds.skip();
ds.write(0x44, 1);
// Тут по протоколу долна быть пауза 750 минимум
PMillis = millis()+PPause;
while (millis() < PMillis){showDisplay();}; // Пока пауза - рефрешим дисплей
present = ds.reset();
ds.skip();
ds.write(0xBE);
for ( i = 0; i < 9; i++) { data[i] = ds.read(); }
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
Temp = (float)raw / 16.0;
dtostrf(Temp, 4, 1, dbuffer);
// пытаемся вставить знак градуса в нужное место
if (dbuffer[0]==44 || dbuffer[0]==46 ||
dbuffer[1]==44 || dbuffer[1]==46 ||
dbuffer[2]==44 || dbuffer[2]==46){
dbuffer[4] = '"';}
else {dbuffer[3] = '"';}
// Функция для записи символов в буфер индикатора
led7print(dbuffer);
ctmillis = millis()+tpause; // время для переключения обратно на часы
}
}
}
if (ct) {if (point) {led7print(time.gettime("H,i"));} else {led7print(time.gettime("Hi"));}} // выводим время и мигаем точкой
// Рефрешим дисплей
showDisplay();
// вызов этой процедуры должен происходить каждый цикл, а также - на вызов следует заменить все delay(xxx)
// такой конструкцией:
// dmillis = millis() + xxx; while (millis() < dmillis){showDisplay();};
}
// Процедура разбора строки и заполнение буфера для индикатора
void led7print (char dstr[6]){
for (int i=0; i<4; i++){digit[i]=ascii2mask(32);} //Заполняем буфер пробелами. Обнуляем типа
//счетчик для входного буфера
byte c = 0;
//счетчик для ВЫходного буфера
byte d = 0;
// Разбираем буфер на символы (ищем запятую)
while (d < 4) {
switch (dstr[c]) {
case 44: c++;bitClear(digit[d-1],7);break; // запятая
case 46: c++;bitClear(digit[d-1],7);break; // точка
case 0 : for (byte i=d; i<4; i++) {digit[i]=22;}; d=4; break; //конец строки, заполняем все остальное пробелами
default: digit[d]=ascii2mask(dstr[c]); c++; d++; // по умолчанию просто переносим символ
}
}
}
// процедура отображения экрана
void showDisplay(){
const byte chr[4] = {0b00001000,0b00000100,0b00000010,0b00000001}; // маска для разряда знакоместа
// отправляем в цикле по два байта в сдвиговые регистры
for(byte i = 0; i <= 3; i++){
digitalWrite(RCLK, LOW); // открываем защелку
shiftOut(DIO, SCLK, MSBFIRST, digit[i]); // отправляем байт с "числом"
shiftOut(DIO, SCLK, MSBFIRST, chr[i]); // включаем разряд
digitalWrite(RCLK, HIGH); // защелкиваем регистры
//delay(1); // ждем немного перед отправкой следующего "числа"
}
}
// Функция перевода кода символа в его маску
byte ascii2mask (int ascii){
// Маски символов
const byte mask[27] = {
0b11000000, // 0
0b11111001, // 1
0b10100100, // 2
0b10110000, // 3
0b10011001, // 4
0b10010010, // 5
0b10000010, // 6
0b11111000, // 7
0b10000000, // 8
0b10010000, // 9
0b10001000, // 10 A
0b10000011, // 11 b
0b10100111, // 12 c
0b10100001, // 13 d
0b10000110, // 14 E
0b11111111, // 15 F
0b10001011, // 16 h
0b11000111, // 17 L
0b10100011, // 18 o
0b10001100, // 19 P
0b10101111, // 20 r
0b10000111, // 21 t
0b11100011, // 22 u
0b11111111, // 23 Пусто
0b10011100, // 24 Градус (")
0b10111111, // 25 -
0b11110111, // 26 _
};
if (ascii > 47 && ascii < 58) {return mask[ascii-48];} // цифры
if (ascii > 64 && ascii < 71) {return mask[ascii-55];} // A-F
if (ascii > 96 && ascii < 103){return mask[ascii-87];} // a-f
switch(ascii){
case 32 :return mask[23]; // пробел
case 34:return mask[24]; // градус
case 45 :return mask[25]; // -
case 95 :return mask[26]; // _
case 72 :return mask[16]; // H
case 104:return mask[16]; // h
case 76 :return mask[17]; // L
case 108:return mask[17]; // l
case 79 :return mask[18]; // O
case 111:return mask[18]; // o
case 80 :return mask[19]; // P
case 112:return mask[19]; // p
case 82 :return mask[20]; // R
case 114:return mask[20]; // r
case 83 :return mask[5]; // S
case 115:return mask[5]; // s
case 84 :return mask[21]; // T
case 116:return mask[21]; // t
case 85 :return mask[22]; // U
case 117:return mask[22]; // u
}
return 25; // если символ не из списка, то отображаем подчеркивание
}
Вы ж вроде не первый день на форуме! Вставьте код нормально!
Я тут третий день. Буду иметь ввиду. А по делу есть комментарий?
Зарегистрирован: 29.12.2015. Длинные ж у Вас дни!
А если нет, так какие могут быть комментарии? Вы всерьёз считаете, что сначала я буду разбирать трудночитаемый код, а потом ещё писать комментарии не имея возможности ссылаться на номера строк (или номера для ссылки пальцем отсчитывать)?
Никто Ваш код по делу не смотрел и смотреть не будет, пока не вставите его нормально.
Это и есть комментарий по делу.
1 день -зарегистрировался.
2 день-вчера задал вопрос.
3 день,сегодня.
В другие дни не заходил. Как писать не знал.
С телефона я не нашел возможности исправить,сделаю это завтра.
Спасибо за замечание.
Возможности исправить нет. Выложите код новым комментарием.
Исправлю завтра вставку кода.
Так всё плохо?
Как исправить? Хотя бы наводку.
Хорошо,спасибо.
// Термометр, часы 1307 и вольтметр на 7-сегментном дисплее на 595 (динамическая индикация) // (с) Naevus 2016 /// Настройки. Все насройки, которые слдует просмотреть/изменить под себя помечены тремя косыми чертами /// /// Экран на 595 сдвиговом регистре #define SCLK 12 /// пины для подключения экрана #define RCLK 11 #define DIO 10 byte digit[4]; // Буфер значений знакомест. В буфер помещается маска выводимых символов для отправки на дисплей /// Вольтметр // // Измеряемое // напряжение ─┐ // │ // ┌┴┐ // │ │R2 // └┬┘ // ├───── Аналоговый вход Arduino // ┌┴┐ // │ │R1 // └┬┘ // │ // ═╧═ // // Rmax должно быть минимум в 3 раза больше Rmin. (позволяет измерять напряжение до 20в). // Например 30 и 10 КОм соответственно. Лучше взять 4 одинаковых резистора, один R1 и три последовательно на R2 #define R1 7.3 /// Резистор в нижнем плече делителя. У меня 7,3К #define R2 29.5 /// Резистор в верхнем плече делителя. У меня 29,5К. #define VIN A0 /// аналоговый вход для вольтметра #define VCORR 0.912 /// коэффициент корректировки /// Для расчета коэффициента: /// 1. выставляем коэффициент = 1 /// 2. Выставляем vmin = 100 /// 3. Компилируем, запускаем. /// 4. Подключаем источник напряжения (АКБ 12В) /// 5. Записываем показания индикатора (например 13,5) /// 6. Замеряем это же напряжение образцовым вольтметром. Записываем (например 12,3) /// 7. Делим замеренное на показаное. Т.е. 12,3/13,5=0,911 /// 8. Это и есть коэффициент для вашего экземпляра ардуины. Прописываем его в vcorr /// 9. Не забываем вернуть обратно vmin /// Если не подключен или не используется - задайте VMIN = 0 а VMAX = 1000. #define VMIN 0 /// минимальное напряжение для аларма (если ниже - будет мигать) #define VMAX 15.1 /// максимальное напряжение для аларма (если выше - будет мигать) #define VRPIN 13 /// Пин для подключения реле #define VRMIN 11.0 /// Реле выключается если напряжение меньше VRMIN #define VRMAX 12.5 /// Реле включается если напряжение больше VRMAX float vvalue; // Напряжение /// Термодатчик #define DS18x20 9 /// Пин термодатчика. Тип термодатчика определяется автоматически #include <OneWire.h> // Библиотека термодатчика OneWire ds(DS18x20); byte type_s = 0; // Тип датчика (после автоматического определения) /// Часы #define POINTTIME 500 /// Полупериод мигания точкой - полсекунды. Этот же период берется за основу для мигания прочих элементов. #define SETPAUSE 500 /// Пауза для быстрой смены показаний при настройке часов при удержании кнопки set #include <Time.h> #include <DS1307RTC.h> #include <Wire.h> long pointmillis; // Время для мигания точкой int point = HIGH; // состояние точки в данный момент int H; // часы int M; // минуты long setmillis=0; //Время для паузы корректировки показаний длинного нажатия /// Кнопки. Кнопки без резисторов, замыкание на землю. // "Режим" - длинное нажатие переводит в режим установки часов. Выход из режима так же или через 5сек // Короткое нажатие - меняет режим установки часов на минут и обратно. // В режиме часов короткое нажатие показывает напряжение // "Установка" - в режиме часов показывает термометр. // В режиме корректировки меняет значение часов или минут. #define MPIN 8 /// пин кнопки "Режим" #define SPIN 7 /// пин кнопки "Установка" #define BPAUSE 2000 /// пауза для длинного нажатия 2 сек #define AD 5 /// пауза для антидребезга. подбирать для конкретных кнопок экспериментально #define TOPAUSE 5000/// пауза для автоматического выхода из режима уствновки часов-минут int mstate = 0; // состояние кнопки mode int sstate = 0; // состояние кнопки set // 0 - не нажата // 1 - нажата, не отпущена (короткое нажатие) // 2 - нажата, отпущена (короткое нажатие) // 3 - нажата не отпущено (длинное нажатие) // 4 - нажата, отпущена (длинное нажатие) long mmillis; // время для запоминания нажатия кнопки mode long smillis; // время для запоминания нажатия кнопки set #include "Bounce2.h"; // Библиотека с антидребезгом Bounce mbutton = Bounce(); // Антидребезговые кнопки Bounce sbutton = Bounce(); /// Общие переменные и константы #define CPAUSE 20000 /// Время отображения часов - 20 сек #define TPAUSE 3500 /// Время отображения градусника (или напряжения) - 3.5 сек long ctmillis = 0; // Время для счетчика переключателя часы-температура int state; // Режим работы: // 0 - Часы. Отображает часы, мигает точкой раз в секунду. Каждые (задано) сек переключается в режим температуты // 1 - Термометр. Запрашивает температуру, отображает заданое время, по окончании - возврат в часы. // 2 - Установка часов. Вход а режим - длительное нажатие кнопки mode. Выход так же или через (задано) сек неактивности. // 3 - Установка минут. Вход а режим - короткое нажатие кнопки mode из режима установки часов. Выход так же или через (задано) сек неактивности. // 4 - Аларм по напряжению. Мигает напряжением если оно вышло за пределы // 5 - Напряжение. время отображения - как у термометра // Из 2 в 3 и обратно - короткое нажатие mode. В 2 и 3 нажатие set меняет показания часов/минут. // Если состояние требует различать вход и повторный вход, то для повторного к состоянию добавляем 10. // Т.е. 0 - часы первый запуск, 10 - часы последующие запуски char dbuffer [6]; // буффер для строки с запятой void setup(void) { // Инициализация пинов экрана pinMode(RCLK, OUTPUT); pinMode(SCLK, OUTPUT); pinMode(DIO, OUTPUT); // Инициализация пинов кнопок. pinMode(MPIN, INPUT_PULLUP); pinMode(SPIN, INPUT_PULLUP); // инициализация антидребезга mbutton.attach(MPIN); sbutton.attach(SPIN); mbutton.interval(AD); sbutton.interval(AD); // Инициализация пина вольтметра pinMode(VIN, INPUT); pinMode (VRPIN, OUTPUT); //Поиск и распознавание термодатчика byte addr[8]; if ( !ds.search(addr)) {ds.reset_search(); type_s = 99;} // датчик не найден else {switch (addr[0]) { // Первый байт - тип датчика case 0x10: type_s = 1; break; //DS18S20 или старый DS1820 case 0x28: type_s = 0; break; //DS18B20 case 0x22: type_s = 0; break; //DS1822 default: type_s = 99; //ошибка определения типа датчика } } // Инициализация часов setSyncProvider(RTC.get); // получаем время с RTC ///установим вручную - один раз установили и хватит ///TimeElements te; ///te.Second = 0; //секунды ///te.Minute = 53; //минуты ///te.Hour = 12; //часы ///te.Day = 16; //день ///te.Month = 2; // месяц ///te.Year = 2016 - 1970; //год в библиотеке отсчитывается с 1970 ///time_t timeVal = makeTime(te); ///RTC.set(timeVal); ///setTime(timeVal); state = 0; // По умолчанию - часы } void loop(void) { switch(state){ case 0 : rclock(); break; // отрабатываем часы (первый раз) case 10 : rclock(); break; // отрабатываем часы case 1 : rtemp() ; break; // отрабатываем термометр (первый раз) case 11 : rtemp() ; break; // отрабатываем термометр case 2 : rhour (); break; // установка часов case 12 : rhour (); break; // установка часов case 3 : rmin (); break; // установка минут case 13 : rmin (); break; // установка минут case 4 : rvalarm(); break; // отрабатываем аларим по напряжению (первый раз) case 14 : rvalarm(); break; // отрабатываем аларим по напряжению case 5 : rvolt() ; break; // отрабатываем напряжение (первый раз) case 15 : rvolt() ; break; // отрабатываем напряжение } // Вольтметр float vread = analogRead(VIN); // Читаем АЦП vvalue = vread * ((5*VCORR*(R1+R2)/R1)/1024); // Преобразуем к напряжению if (vvalue < VRMIN){digitalWrite(VRPIN,LOW);} // Выкл реле если напряжение меньше if (vvalue > VRMAX){digitalWrite(VRPIN,HIGH);} // Вкл реле если напряжение больше if (vvalue > VMAX || vvalue < VMIN) {state = 4;};// аларм вольтметра rbutton(); // опрашиваем кнопки showDisplay(); // Рефрешим дисплей } void rbutton (void) { // Кнопки mbutton.update(); // Mode switch (mstate){ case 0: if (!mbutton.read()){mstate = 1; mmillis = millis() + BPAUSE;}// нажали кнопку break; case 1: if ( mbutton.read()){mstate = 2;} // отжали кнопку else {if (millis()>mmillis){mstate = 3;}} // длинное нажатие break; case 2: mstate = 0; break; case 3: if ( mbutton.read()){mstate = 4;} // отжали длинное нажатие break; case 4: mstate = 0; break; default: mstate = 0; } sbutton.update(); // Set switch (sstate){ case 0: if (!sbutton.read()){sstate = 1; smillis = millis() + BPAUSE;}// нажали кнопку break; case 1: if ( sbutton.read()){sstate = 2;} // отжали кнопку else {if (millis()>smillis){sstate = 3;}} // длинное нажатие break; case 2: sstate = 0; break; case 3: if ( sbutton.read()){sstate = 4;} // отжали длинное нажатие break; case 4: sstate = 0; break; default: sstate = 0; } } void rvolt(void){ // Отображение напряжения if (state == 15) { // Повторный вход. просто проверяем время и выходим if (millis() > ctmillis){state = 0;} // Если время отображения термометра кончилось, переключаемся на часы return; } else { dtostrf(vvalue, 4, 1, dbuffer); // Преобразуем напряжение в набор символов // пытаемся вставить знак U в нужное место (проверяем, есть ли в наборе символов точка или запятая) if (dbuffer[1]==44 || dbuffer[1]==46 || dbuffer[2]==44 || dbuffer[2]==46){dbuffer[4] = 'U';} else {dbuffer[3] = 'U';} led7print(dbuffer); // Функция для записи символов в буфер индикатора ctmillis = millis()+TPAUSE; // время для переключения обратно на часы state = 15; // меняем состояние на повторное } } void rvalarm(void){ // Аларм напряжения (мигает) if (vvalue>VMIN && vvalue<VMAX) {state = 0; return;} //Если напряжение нормальное - выходим в часы if (millis()>=pointmillis) { point = !point; //раз в pointtime мигаем напряжением pointmillis = pointmillis + POINTTIME; if (point) { dtostrf(vvalue, 4, 1, dbuffer); // Преобразуем напряжение в набор символов // пытаемся вставить знак U в нужное место (проверяем, есть ли в наборе символов точка или запятая) if (dbuffer[1]==44 || dbuffer[1]==46 || dbuffer[2]==44 || dbuffer[2]==46){dbuffer[4] = 'U';} else {dbuffer[3] = 'U';} } else { dbuffer[0] = ' '; dbuffer[1] = ' '; dbuffer[2] = ' '; dbuffer[3] = ' '; } // мигаем напряжением led7print(dbuffer); // Функция для записи символов в буфер индикатора } } void rclock(void) { // Отображение часов char cbuff[6]; //Буфер для часов if (state == 10) { // Повторный вход. просто проверяем время if (millis() > ctmillis){state = 1; return;} // Если время отображения часов кончилось, переключаемся на термометр // Проверяем кнопки if (mstate == 2) {state = 5; return;} // если нажата Mode то переходим к вольтметру if (sstate == 2) {state = 1; return;} // если нажата Set то переходим к термометру if (mstate == 3) {state = 2; return;} // если долго нажата Mode то переходим к корректировке часов } else{if (mstate != 4) { //если длинная кнопка отпущена state = 10; ctmillis = millis()+CPAUSE;} // если первый вход - запоминаем время } // мигание точки в часах if (millis()>=pointmillis) { point = !point; //раз в pointtime меняем точку на не точку pointmillis = pointmillis + POINTTIME; H=hour(); M=minute(); if (point) { cbuff[0]=H/10; cbuff[1]=H-(cbuff[0]*10); cbuff[0]=cbuff[0]+48; // +48, чтобы из значения получить ascii код цифры cbuff[1]=cbuff[1]+48; cbuff[2]=','; cbuff[3]=M/10; cbuff[4]=M-(cbuff[3]*10); cbuff[3]=cbuff[3]+48; cbuff[4]=cbuff[4]+48; } else { cbuff[0]=H/10; cbuff[1]=H-(cbuff[0]*10); cbuff[2]=M/10; cbuff[3]=M-(cbuff[2]*10); cbuff[0]=cbuff[0]+48; cbuff[1]=cbuff[1]+48; cbuff[2]=cbuff[2]+48; cbuff[3]=cbuff[3]+48; } led7print(cbuff); // выводим время и мигаем точкой } } void rhour(void) { // Установка часов char cbuff[6]; //Буфер для часов M=minute(); if (state == 2) { // Первый вход. Ждем когда отпустят кнопку mode if (mstate != 3){ //Если кнопку отпустили state = 12; ctmillis = millis()+TOPAUSE; // Запоминаем время H=hour();} } if (state == 12){ if (millis()>ctmillis){state = 0;} // Проверяем кнопки if (mstate == 2) {state = 3; return;} // если была нажата Mode то переходим к установке минут if (mstate == 3) {state = 0; return;} // если долго нажата Mode то переходим к часам if (sstate == 2){ // если нажата Set H = H+1; if(H > 23) {H = 0;} ctmillis = millis()+TOPAUSE; // и обнуляем таймаут для выхода } if (sstate == 3) { // если долго нажата Set if (millis() > setmillis) { H++; if(H > 23) {H = 0;} setmillis = millis() + SETPAUSE; // пауза чтобы показания менялись не слишком быстро } ctmillis = millis()+TOPAUSE; // и обнуляем таймаут для выхода } if (sstate == 2 || sstate == 4) { //кнопку отпустили - толкаем все в rtc setTime(H, M, 0, day(), month(), year()); RTC.set(now()); } } cbuff[0]=H/10; cbuff[1]=H-(cbuff[0]*10); cbuff[0]=cbuff[0]+48; // +48, чтобы из значения получить ascii код цифры cbuff[1]=cbuff[1]+48; cbuff[2]=','; cbuff[3]=M/10; cbuff[4]=M-(cbuff[3]*10); cbuff[3]=cbuff[3]+48; cbuff[4]=cbuff[4]+48; // мигание часов if (millis()>=pointmillis) { point = !point; //раз в pointtime меняем точку на не точку pointmillis = pointmillis + POINTTIME; if (point && sstate != 3) { //мигаем если не нажата set cbuff[0]=' '; cbuff[1]=' '; } led7print(cbuff); // выводим время и мигаем } } void rmin(void) { // Установка минут char cbuff[6]; //Буфер для часов H=hour(); if (state == 3) { // Первый вход. state = 13; ctmillis = millis()+TOPAUSE; // Запоминаем время M=minute(); } if (state == 13){ if (millis()>ctmillis){state = 0;} // Проверяем кнопки if (mstate == 2) {state = 2; return;} // если была нажата Mode то переходим к установке часов if (mstate == 3) {state = 0; return;} // если долго нажата Mode то переходим к часам if (sstate == 2) { // если нажата Set то прибавляем часы M = M+1; if(M > 59) {M = 0;} ctmillis = millis()+TOPAUSE; // и обнуляем таймаут для выхода } if (sstate == 3) { // если нажата Set то прибавляем часы if (millis() > setmillis) { M = M+1; if(M > 59) {M = 0;} setmillis = millis() + SETPAUSE; // пауза чтобы показания менялись не слишком быстро } ctmillis = millis()+TOPAUSE; // и обнуляем таймаут для выхода } if (sstate == 2 || sstate == 4) { /// тут как то надо затолкать часы в RTC setTime(H, M, 0, day(), month(), year()); RTC.set(now()); } } cbuff[0]=H/10; cbuff[1]=H-(cbuff[0]*10); cbuff[0]=cbuff[0]+48; // +48, чтобы из значения получить ascii код цифры cbuff[1]=cbuff[1]+48; cbuff[2]=','; cbuff[3]=M/10; cbuff[4]=M-(cbuff[3]*10); cbuff[3]=cbuff[3]+48; cbuff[4]=cbuff[4]+48; // мигание часов if (millis()>=pointmillis) { point = !point; //раз в pointtime меняем точку на не точку pointmillis = pointmillis + POINTTIME; if (point && sstate != 3) { //мигаем если не нажата set cbuff[3]=' '; cbuff[4]=' '; } led7print(cbuff); // выводим время и мигаем } } void rtemp (void) { // Отображение температуры float temp; // Температура byte present = 0;// Наличие датчика byte data[12]; // Сюда читаем данные с датчика if (type_s == 99 ) {state = 0; return;} // если датчик не найден, то сразу возвращаемся в часы if (state == 11) { // Повторный вход. просто проверяем время и выходим if (millis() > ctmillis){state = 0;} // Если время отображения термометра кончилось, переключаемся на часы return; } else { // Иначе - запрашиваем температуру byte i; ds.reset(); ds.skip(); ds.write(0x44, 1); delays(800); //по протоколу пауза перед считыванием температуры. Минимум 750мс present = ds.reset(); ds.skip(); ds.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = ds.read(); } int16_t raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; // 9 bit resolution default if (data[7] == 0x10) { // "count remain" gives full 12 bit resolution raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); // at lower res, the low bits are undefined, so let's zero them if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms // default is 12 bit resolution, 750 ms conversion time } temp = (float)raw / 16.0; // Получаем температуру dtostrf(temp, 4, 1, dbuffer); // Преобразуем температуру в набор символов // пытаемся вставить знак градуса в нужное место (проверяем, есть ли в наборе символов точка или запятая) if (dbuffer[1]==44 || dbuffer[1]==46 || dbuffer[2]==44 || dbuffer[2]==46){ dbuffer[4] = '"';} else {dbuffer[3] = '"';} led7print(dbuffer); // Функция для записи символов в буфер индикатора ctmillis = millis()+TPAUSE; // время для переключения обратно на часы state = 11; // меняем состояние на повторное } } void delays (long pause){ // Замена штатной функции delay на собственную - с рефрешем индикатора long pmillis = millis()+pause; // запоминаем время паузы while (millis() < pmillis){showDisplay();}; // Ждем наступления времени паузы, попутно рефрешим дисплей } void led7print (char dstr[6]){ // Процедура разбора строки и заполнение буфера для индикатора byte c = 0; //счетчик для входного буфера byte d = 0; //счетчик для ВЫходного буфера // Разбираем буфер на символы (ищем запятую) while (d < 4) { switch (dstr[c]) { case 44: c++;bitClear(digit[d-1],7);break; // запятая case 46: c++;bitClear(digit[d-1],7);break; // точка case 0 : for (byte i=d; i<4; i++) {digit[i]=22;}; d=4; break; //конец строки, заполняем все остальное пробелами default: digit[d]=ascii2mask(dstr[c]); c++; d++; // по умолчанию просто переносим символ } } } void showDisplay(void){ // процедура отображения экрана const byte chr[4] = {0b00001000,0b00000100,0b00000010,0b00000001}; // маска для разряда знакоместа for(byte i = 0; i <= 3; i++){ // отправляем в цикле по два байта в сдвиговые регистры digitalWrite(RCLK, LOW); // открываем защелку shiftOut(DIO, SCLK, MSBFIRST, digit[i]); // отправляем байт с "числом" shiftOut(DIO, SCLK, MSBFIRST, chr[i]); // включаем разряд digitalWrite(RCLK, HIGH); // защелкиваем регистры //delay(1); // ждем немного перед отправкой следующего "числа"... если не ждать то мигания меньше. } } byte ascii2mask (int ascii){ // Функция перевода кода символа в его маску // Маски символов const byte mask[27] = { 0b11000000, // 0 0b11111001, // 1 0b10100100, // 2 0b10110000, // 3 0b10011001, // 4 0b10010010, // 5 0b10000010, // 6 0b11111000, // 7 0b10000000, // 8 0b10010000, // 9 0b10001000, // 10 A 0b10000011, // 11 b 0b10100111, // 12 c 0b10100001, // 13 d 0b10000110, // 14 E 0b11111111, // 15 F 0b10001011, // 16 h 0b11000111, // 17 L 0b10100011, // 18 o 0b10001100, // 19 P 0b10101111, // 20 r 0b10000111, // 21 t 0b11100011, // 22 u 0b11111111, // 23 Пусто 0b10011100, // 24 Градус (") 0b10111111, // 25 - 0b11110111, // 26 _ }; if (ascii > 47 && ascii < 58) {return mask[ascii-48];} // цифры if (ascii > 64 && ascii < 71) {return mask[ascii-55];} // A-F if (ascii > 96 && ascii < 103){return mask[ascii-87];} // a-f switch(ascii){ case 32 :return mask[23]; // пробел case 34:return mask[24]; // градус case 45 :return mask[25]; // - case 95 :return mask[26]; // _ case 72 :return mask[16]; // H case 104:return mask[16]; // h case 76 :return mask[17]; // L case 108:return mask[17]; // l case 79 :return mask[18]; // O case 111:return mask[18]; // o case 80 :return mask[19]; // P case 112:return mask[19]; // p case 82 :return mask[20]; // R case 114:return mask[20]; // r case 83 :return mask[5]; // S case 115:return mask[5]; // s case 84 :return mask[21]; // T case 116:return mask[21]; // t case 85 :return mask[22]; // U case 117:return mask[22]; // u } return mask[26]; // если символ не из списка, то отображаем подчеркивание }Ребята, помогите пожалуйста новичку. Слепил скетч, не могу на LSD 1602 вывести дни недели. Один раз слуыайно получилось, потом исчезло... Я в этом чайник, если где неправильно, поправте пожалуйста.
Ребята, помогите пожалуйста новичку. Слепил скетч, не могу на LSD 1602 вывести дни недели. Один раз слуыайно получилось, потом исчезло... Я в этом чайник, если где неправильно, поправте пожалуйста.
#include "Wire.h" #include "DS1307new.h" #include "LiquidCrystal.h" // библиотека экрана LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup(){ Serial.begin(9600); if(RTC.isPresent()){ // обнаружен ли модуль? Serial.println("RTC Ready"); // все хорошо } else { Serial.println("Error!!!! RTC Module not found"); // сообщаем о проблеме while(1); // и останавливаем скетч } lcd.begin(16, 2); // запускаем библиотеку экрана } void loop(){ RTC.getTime();// получить время от модуля printTimeToSerial(); // выводим полученное время в лог printTimeToLCD();; // выводи время на экран doSerialCommands(); // слушаем и выполняем команды из Serial } // Выводит текущие время в Serial void printTimeToSerial(){ byte static prevSecond=0; // тут будем хранить, сколько секунд было при прошлом отчете if(RTC.second!=prevSecond){ // что-то делаем только если секунды поменялись Serial.print(RTC.hour); // часы Serial.print(":"); // разделитель Serial.print(RTC.minute); Serial.print(":"); Serial.println(RTC.second); prevSecond=RTC.second; // запомнили когда мы "отчитались" } } // Выводит текущие время на LCD void printTimeToLCD(){ byte static prevSecond=0; // тут будем хранить, сколько секунд было при выводе if(RTC.second!=prevSecond){ // что-то делаем только если секунды поменялись lcd.setCursor(4,1); // устанавливаем позицию курсора if(RTC.hour<10)lcd.print(" "); lcd.print(RTC.hour); // часы lcd.print(":"); // разделитель if(RTC.minute<10)lcd.print(0); // лидирующий ноль, если нужен lcd.print(RTC.minute); lcd.print(":"); if (RTC.second < 10) // correct second if necessary lcd.print("0"); lcd.print(RTC.second); lcd.setCursor(5,0); // устанавливаем позицию курсора lcd.print(" "); if (RTC.day < 10) // correct date if necessary { lcd.print(""); lcd.print(RTC.day); } else { lcd.print(RTC.day); } lcd.print("."); if (RTC.month < 10) // correct month if necessary { lcd.print("0"); lcd.print(RTC.month); } else { lcd.print(RTC.month); } lcd.print("."); lcd.print(RTC.year); // Year need not to be changed lcd.print(" "); lcd.setCursor(1,0); // устанавливаем позицию курсора switch (RTC.dow) // вывести день недели { case 1: lcd.print("MON"); break; case 2: lcd.print("TUE"); break; case 3: lcd.print("WED"); break; case 4: lcd.print("THU"); break; case 5: lcd.print("FRI"); break; case 6: lcd.print("SAT"); break; case 7: lcd.print("SUN"); break; } prevSecond=RTC.second; // запомнили когда мы "отчитались" } } // устанавливает часы модуля на какое-то заранее определенное время void setSomeTime(){ RTC.stopClock();// останавливаем часы RTC.fillByHMS(14,29,0); // подкручиваем стрелки на 14:29:00 RTC.fillByYMD(2017,2,3); // установить дату 2017,2,3 RTC.setTime();// отправляем "подкрученное время" самому модулю RTC.startClock(); // и опять запускаем часы } // слушает из Serial команды и выполняет их. Каждая команда - один символ. // доступны команды: // s - установить время указанное в функции setSomeTime() void doSerialCommands(){ if(Serial.available()){ // что-нибудь пришло? char ch=Serial.read(); // читаем что пришло switch(ch){ case 's': // команда установки времени setSomeTime(); // устанавливаем break; // тут, в будущем, мы можем добавлять дополнительные команды default:; // на неизвестную команду - ничего не делаем }; } }Здравствуйте, помогите разобраться с проблемой отображения времени DS1307 на LCD1602, I2C. Это мой как-бы первый проект, учусь на своих же ошибках, буду очень признателен если ткнете носом на мои ошибки.)
Скетч с примера отображает хорошо, а когда скрещиваю его с своим то при первом включении на несколько сек. время выводиться, а далее как нв фото(верхний правый угол). Нужно только часы и минуты.
#include <OneWire.h> #include <Wire.h> OneWire ds(5); //пин для датчиков byte addr1[8]={0x28,0xFF,0xC8,0x8A,0xC2,0x15,0x01,0xC7}; // byte addr2[8]={0x28,0xFF,0x66,0x18,0xC2,0x15,0x02,0x52}; // byte addr3[8]={0x28, 0xFF, 0xAA, 0xDB, 0xA2, 0x16, 0x04, 0xCD}; // volatile int temp1,temp2,temp3; #include "RTClib.h" RTC_DS1307 RTC; #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3f, 16, 2); #if defined(ARDUINO) && ARDUINO >= 100 #define printByte(args) write(args); #else #define printByte(args) print(args,BYTE); #endif int analog = A0; //пульт руль int Gabarit = 2; //вход lsd int LedLsd = 6; //выход lsd int inPin = 3; //газ int analogInput = A6; //вход для вольтметра float vin = 0; // ВХОДНОЕ ЕАПРЯЖЕНИЕ //Символ градуса byte grad[8] = { 0b01100, 0b10010, 0b10010, 0b01100, 0b00000, 0b00000, 0b00000, 0b00000 }; void setup(void) { Serial.begin(9600); WDTCSR=(1<<WDCE)|(1<<WDE); //установить биты WDCE WDE (что б разрешить запись в другие биты WDTCSR=(1<<WDIE)| (1<<WDP2)|(1<<WDP1); // разрешение прерывания + выдержка 1 секунда // снять все ремарки если нужно поменять разрешение // ds.reset(); // сброс шины // ds.select(addr2); //выставить адрес // ds.write(0x4E); // разрешение записать конфиг // ds.write(0x7F); // Th контроль температуры макс 128грд // ds.write(0xFF); //Tl контроль температуры мин -128грд // ds.write(0x60); // 0x60 12-бит разрешение, 0x00 -9бит разрешение pinMode(8, INPUT); pinMode(9, INPUT); pinMode(10, INPUT); pinMode(11, INPUT); pinMode(12, INPUT); pinMode(analogInput, INPUT); //пин А6 как вход pinMode(LedLsd, OUTPUT); //пин 6 как выход для LSD pinMode(Gabarit, INPUT); //пин 2 как вход от габаритов для LSD lcd.init(); // Инициализация lcd lcd.backlight(); // Включаем подсветку lcd.createChar(0, grad); //Символ градуса lcd.setCursor(4, 0); //курсор lcd.print("Hello :)"); //надпись при включении lcd.setCursor(3, 1); //курсор lcd.print("Good day."); //надпись при включении delay(1500); //задержка lcd.clear(); //очистить екран Wire.begin(); RTC.begin(); if (! RTC.isrunning()) { // Serial.println("RTC is NOT running!"); // following line sets the RTC to the date & time this sketch was compiled RTC.adjust(DateTime(__DATE__, __TIME__)); } } void loop() { //часы DateTime now = RTC.now(); lcd.setCursor(11, 0); lcd.print(now.hour(), DEC); lcd.print(':'); lcd.print(now.minute(), DEC); //газ if (digitalRead(inPin)) { lcd.setCursor(5, 0); lcd.print("GAZ"); } else { lcd.setCursor(5, 0); lcd.print(" - "); } // lcd.setCursor(0, 0); //темп салон // lcd.print(""); // lcd.print(temp2/16); // lcd.printByte(0); lcd.setCursor(0, 1); //темп улица lcd.print(""); lcd.print(temp1/16); lcd.printByte(0); lcd.setCursor(5, 1); //темп двигатель lcd.print(""); lcd.print(temp3/16); lcd.printByte(0); //вольтметр vin = float(analogRead(analogInput))/18.3; //подстроичное число для показа вольтметра lcd.setCursor(11, 1); lcd.print(""); lcd.print(vin, 1); lcd.print("V"); analog=analogRead(14); //считываем сигнал с пина АЦП if(analog>750&&analog<820) // k1 - up { pinMode(8, OUTPUT); digitalWrite(8,LOW); delay(50); pinMode(8, INPUT); delay(150); } if(analog>300&&analog<400) //k2 - right { pinMode(9, OUTPUT); digitalWrite(9,LOW); delay(50); pinMode(9, INPUT); delay(150); } if(analog>200&&analog<290) //k3 down { pinMode(10, OUTPUT); digitalWrite(10,LOW); delay(50); pinMode(10, INPUT); delay(150); } if(analog>100&&analog<190) //k4 vol+ { // для енкодера pinMode(11, OUTPUT); pinMode(12, OUTPUT); digitalWrite(11, HIGH); delay(25); digitalWrite(12, HIGH); delay(25); digitalWrite(11,LOW); delay(25); digitalWrite(12,LOW); delay(25); pinMode(11, INPUT); pinMode(12, INPUT); } if(analog>=0&&analog<80) //k5 vol- { // для енкодера pinMode(12, OUTPUT); pinMode(11, OUTPUT); digitalWrite(12, HIGH); delay(25); digitalWrite(11, HIGH); delay(25); digitalWrite(12,LOW); delay(25); digitalWrite(11,LOW); delay(25); pinMode(12, INPUT); pinMode(11, INPUT); } } ISR (WDT_vect){ //вектор прерывания WD static boolean n=0; // флаг работы: запрос температуры или её чтение n=!n; if (n) {ds.reset(); // сброс шины ds.write(0xCC);//обращение ко всем датчикам ds.write(0x44);// начать преобразование (без паразитного питания) } else {ds.reset(); ds.select(addr1); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp1 = ds.read() | (ds.read()<<8); //прочитаны 2 байта // получение с 2-го датчика ds.reset(); ds.select(addr2); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp2 = ds.read() | (ds.read()<<8); //прочитаны 2 байта ds.reset(); ds.select(addr3); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp3 = ds.read() | (ds.read()<<8); //прочитаны 2 байта } }Честно говоря, не понял, что означает Ваше "а далее как нв фото". Вас не устраивает, что печать сбивается? Так Вы же печатаете просто числа, и если число двузначное, то всё в порядке, но как только оно становится однозначным, оно печаатается на месте левой цифры, а правая остаётся на месте, её никто не стирает.
Если памяти хватает, то вместо строк 94-96 напишите
{ char buff[6]; sprintf(buff, "%02d:%02d", now.hour(), now.minute()); lcd.print(buff); }Если начнёт ругаться, что типа sprintf не объявлен, добавьте в начале #include <stdio.h>
Заменил строки как Вы и сказали, ни на что не ругался скетч, так что библиотеку не добавлял.
Теперь при запуске на пару секунд показывает реальное время, а потом "00:00" и начинает кожен раз заново идти, тоисть "00:01" через минуту "00:02" и так далее.
Хотел попробовать добавит библиотеку #include но времени не хватило, будит ли с ней толк или нет?
СПС.
Думаю, что с показом это никак не связано, ошибка в другом, но чтобы убедитсья и быть уверенным, поставьте перед sprintf вывод в сериал значений now.hour() и now.minute().
Скажите, что там выводится. Тоже, что на часах или нет.
И заодно давайте текущую версию скетча.
Ок, завтра постараюсь сделать, щас ПК нет. СПС.
вот скетч на данній момент
#include <OneWire.h> #include <Wire.h> OneWire ds(5); //пин для датчиков byte addr1[8]={0x28,0xFF,0xC8,0x8A,0xC2,0x15,0x01,0xC7}; // byte addr2[8]={0x28,0xFF,0x66,0x18,0xC2,0x15,0x02,0x52}; // byte addr3[8]={0x28, 0xFF, 0xAA, 0xDB, 0xA2, 0x16, 0x04, 0xCD}; // volatile int temp1,temp2,temp3; #include "RTClib.h" RTC_DS1307 RTC; #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3f, 16, 2); #if defined(ARDUINO) && ARDUINO >= 100 #define printByte(args) write(args); #else #define printByte(args) print(args,BYTE); #endif int analog = A0; //пульт руль int Gabarit = 2; //вход lsd int LedLsd = 6; //выход lsd int inPin = 3; //газ int analogInput = A6; //вход для вольтметра float vin = 0; // ВХОДНОЕ ЕАПРЯЖЕНИЕ //Символ градуса byte grad[8] = { 0b01100, 0b10010, 0b10010, 0b01100, 0b00000, 0b00000, 0b00000, 0b00000 }; void setup(void) { Serial.begin(9600); WDTCSR=(1<<WDCE)|(1<<WDE); //установить биты WDCE WDE (что б разрешить запись в другие биты WDTCSR=(1<<WDIE)| (1<<WDP2)|(1<<WDP1); // разрешение прерывания + выдержка 1 секунда // снять все ремарки если нужно поменять разрешение // ds.reset(); // сброс шины // ds.select(addr2); //выставить адрес // ds.write(0x4E); // разрешение записать конфиг // ds.write(0x7F); // Th контроль температуры макс 128грд // ds.write(0xFF); //Tl контроль температуры мин -128грд // ds.write(0x60); // 0x60 12-бит разрешение, 0x00 -9бит разрешение pinMode(8, INPUT); pinMode(9, INPUT); pinMode(10, INPUT); pinMode(11, INPUT); pinMode(12, INPUT); pinMode(analogInput, INPUT); //пин А6 как вход pinMode(LedLsd, OUTPUT); //пин 6 как выход для LSD pinMode(Gabarit, INPUT); //пин 2 как вход от габаритов для LSD lcd.init(); // Инициализация lcd lcd.backlight(); // Включаем подсветку lcd.createChar(0, grad); //Символ градуса lcd.setCursor(4, 0); //курсор lcd.print("Hello :)"); //надпись при включении lcd.setCursor(3, 1); //курсор lcd.print("Good day."); //надпись при включении delay(1500); //задержка lcd.clear(); //очистить екран Wire.begin(); RTC.begin(); if (! RTC.isrunning()) { RTC.adjust(DateTime(__DATE__, __TIME__)); } } void loop() { //часы DateTime now = RTC.now(); lcd.setCursor(11, 0); char buff[6]; sprintf(buff, "%02d:%02d", now.hour(), now.minute()); lcd.println(buff); //газ if (digitalRead(inPin)) { lcd.setCursor(5, 0); lcd.print("GAZ"); } else { lcd.setCursor(5, 0); lcd.print(" - "); } lcd.setCursor(0, 0); //темп салон lcd.print(""); lcd.print(temp2/16); lcd.printByte(0); lcd.setCursor(0, 1); //темп улица lcd.print(""); lcd.print(temp1/16); lcd.printByte(0); lcd.setCursor(5, 1); //темп двигатель lcd.print(""); lcd.print(temp3/16); lcd.printByte(0); //вольтметр vin = float(analogRead(analogInput))/18.3; //подстроичное число для показа вольтметра lcd.setCursor(11, 1); lcd.print(""); lcd.print(vin, 1); lcd.print("V"); analog=analogRead(14); //считываем сигнал с пина АЦП if(analog>750&&analog<820) // k1 - up { pinMode(8, OUTPUT); digitalWrite(8,LOW); delay(50); pinMode(8, INPUT); delay(150); } if(analog>300&&analog<400) //k2 - right { pinMode(9, OUTPUT); digitalWrite(9,LOW); delay(50); pinMode(9, INPUT); delay(150); } if(analog>200&&analog<290) //k3 down { pinMode(10, OUTPUT); digitalWrite(10,LOW); delay(50); pinMode(10, INPUT); delay(150); } if(analog>100&&analog<190) //k4 vol+ { // для енкодера pinMode(11, OUTPUT); pinMode(12, OUTPUT); digitalWrite(11, HIGH); delay(25); digitalWrite(12, HIGH); delay(25); digitalWrite(11,LOW); delay(25); digitalWrite(12,LOW); delay(25); pinMode(11, INPUT); pinMode(12, INPUT); } if(analog>=0&&analog<80) //k5 vol- { // для енкодера pinMode(12, OUTPUT); pinMode(11, OUTPUT); digitalWrite(12, HIGH); delay(25); digitalWrite(11, HIGH); delay(25); digitalWrite(12,LOW); delay(25); digitalWrite(11,LOW); delay(25); pinMode(12, INPUT); pinMode(11, INPUT); } } ISR (WDT_vect){ //вектор прерывания WD static boolean n=0; // флаг работы: запрос температуры или её чтение n=!n; if (n) {ds.reset(); // сброс шины ds.write(0xCC);//обращение ко всем датчикам ds.write(0x44);// начать преобразование (без паразитного питания) } else {ds.reset(); ds.select(addr1); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp1 = ds.read() | (ds.read()<<8); //прочитаны 2 байта // получение с 2-го датчика ds.reset(); ds.select(addr2); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp2 = ds.read() | (ds.read()<<8); //прочитаны 2 байта ds.reset(); ds.select(addr3); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp3 = ds.read() | (ds.read()<<8); //прочитаны 2 байта } }Вы в курсе, что у Вас делает 79-я строка?
в порте пишет постоянно 5555555....
#include <OneWire.h> #include <Wire.h> OneWire ds(5); //пин для датчиков byte addr1[8]={0x28,0xFF,0xC8,0x8A,0xC2,0x15,0x01,0xC7}; // byte addr2[8]={0x28,0xFF,0x66,0x18,0xC2,0x15,0x02,0x52}; // byte addr3[8]={0x28, 0xFF, 0xAA, 0xDB, 0xA2, 0x16, 0x04, 0xCD}; // volatile int temp1,temp2,temp3; #include "RTClib.h" RTC_DS1307 RTC; #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3f, 16, 2); #if defined(ARDUINO) && ARDUINO >= 100 #define printByte(args) write(args); #else #define printByte(args) print(args,BYTE); #endif int analog = A0; //пульт руль int Gabarit = 2; //вход lsd int LedLsd = 6; //выход lsd int inPin = 3; //газ int analogInput = A6; //вход для вольтметра float vin = 0; // ВХОДНОЕ ЕАПРЯЖЕНИЕ //Символ градуса byte grad[8] = { 0b01100, 0b10010, 0b10010, 0b01100, 0b00000, 0b00000, 0b00000, 0b00000 }; void setup(void) { Serial.begin(9600); WDTCSR=(1<<WDCE)|(1<<WDE); //установить биты WDCE WDE (что б разрешить запись в другие биты WDTCSR=(1<<WDIE)| (1<<WDP2)|(1<<WDP1); // разрешение прерывания + выдержка 1 секунда // снять все ремарки если нужно поменять разрешение // ds.reset(); // сброс шины // ds.select(addr2); //выставить адрес // ds.write(0x4E); // разрешение записать конфиг // ds.write(0x7F); // Th контроль температуры макс 128грд // ds.write(0xFF); //Tl контроль температуры мин -128грд // ds.write(0x60); // 0x60 12-бит разрешение, 0x00 -9бит разрешение pinMode(8, INPUT); pinMode(9, INPUT); pinMode(10, INPUT); pinMode(11, INPUT); pinMode(12, INPUT); pinMode(analogInput, INPUT); //пин А6 как вход pinMode(LedLsd, OUTPUT); //пин 6 как выход для LSD pinMode(Gabarit, INPUT); //пин 2 как вход от габаритов для LSD lcd.init(); // Инициализация lcd lcd.backlight(); // Включаем подсветку lcd.createChar(0, grad); //Символ градуса lcd.setCursor(4, 0); //курсор lcd.print("Hello :)"); //надпись при включении lcd.setCursor(3, 1); //курсор lcd.print("Good day."); //надпись при включении delay(1500); //задержка lcd.clear(); //очистить екран Wire.begin(); RTC.begin(); if (! RTC.isrunning()) { RTC.adjust(DateTime(__DATE__, __TIME__)); } } void loop() { //часы DateTime now = RTC.now(); lcd.setCursor(11, 0); char buff[6]; Serial.print(sprintf(buff, "%02d:%02d", now.hour(), now.minute())); lcd.println(buff); //газ if (digitalRead(inPin)) { lcd.setCursor(5, 0); lcd.print("GAZ"); } else { lcd.setCursor(5, 0); lcd.print(" - "); } lcd.setCursor(0, 0); //темп салон lcd.print(""); lcd.print(temp2/16); lcd.printByte(0); lcd.setCursor(0, 1); //темп улица lcd.print(""); lcd.print(temp1/16); lcd.printByte(0); lcd.setCursor(5, 1); //темп двигатель lcd.print(""); lcd.print(temp3/16); lcd.printByte(0); //вольтметр vin = float(analogRead(analogInput))/18.3; //подстроичное число для показа вольтметра lcd.setCursor(11, 1); lcd.print(""); lcd.print(vin, 1); lcd.print("V"); analog=analogRead(14); //считываем сигнал с пина АЦП if(analog>750&&analog<820) // k1 - up { pinMode(8, OUTPUT); digitalWrite(8,LOW); delay(50); pinMode(8, INPUT); delay(150); } if(analog>300&&analog<400) //k2 - right { pinMode(9, OUTPUT); digitalWrite(9,LOW); delay(50); pinMode(9, INPUT); delay(150); } if(analog>200&&analog<290) //k3 down { pinMode(10, OUTPUT); digitalWrite(10,LOW); delay(50); pinMode(10, INPUT); delay(150); } if(analog>100&&analog<190) //k4 vol+ { // для енкодера pinMode(11, OUTPUT); pinMode(12, OUTPUT); digitalWrite(11, HIGH); delay(25); digitalWrite(12, HIGH); delay(25); digitalWrite(11,LOW); delay(25); digitalWrite(12,LOW); delay(25); pinMode(11, INPUT); pinMode(12, INPUT); } if(analog>=0&&analog<80) //k5 vol- { // для енкодера pinMode(12, OUTPUT); pinMode(11, OUTPUT); digitalWrite(12, HIGH); delay(25); digitalWrite(11, HIGH); delay(25); digitalWrite(12,LOW); delay(25); digitalWrite(11,LOW); delay(25); pinMode(12, INPUT); pinMode(11, INPUT); } } ISR (WDT_vect){ //вектор прерывания WD static boolean n=0; // флаг работы: запрос температуры или её чтение n=!n; if (n) {ds.reset(); // сброс шины ds.write(0xCC);//обращение ко всем датчикам ds.write(0x44);// начать преобразование (без паразитного питания) } else {ds.reset(); ds.select(addr1); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp1 = ds.read() | (ds.read()<<8); //прочитаны 2 байта // получение с 2-го датчика ds.reset(); ds.select(addr2); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp2 = ds.read() | (ds.read()<<8); //прочитаны 2 байта ds.reset(); ds.select(addr3); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp3 = ds.read() | (ds.read()<<8); //прочитаны 2 байта } }синхронизирует с пк время и дату.
при выводе 79 строки в комент на ЛСД начинают лезьт кряказябры...)
синхронизирует с пк время и дату.
при выводе 79 строки в комент на ЛСД начинают лезьт кряказябры...)
Нет. Она устанавливает в часах время компиляции скетча. И так каждый раз при включении Ардуино. Вот у Вас часы и начинают идти каждый раз с одного и того же времени. Перезальете скетч - это время меняется.
Нужно один раз залить и запустить скетч с этой строкой. А потом закомментировать её и залить скетч без этой строки. Пользоваться.
После этого разбираться с отображением.
проблема в том что время время показывается пару сек и пропадает, а вместо времени 00:00.
в порте пишет постоянно 5555555....
Блин, Вы издеваетесь?
Я Вас что просил напечатать? Значения now.hour() и now.minute(). Понимаете? Значения! Чему они равны!
А Вы что печатаете?
Serial.print(sprintf(buff,"%02d:%02d", now.hour(), now.minute()));Длину буфера buff? Так я и без Вас знаю, что она 5 равна.
Напечатайте то, что я просил.
сори, неверно понял((((
при вот таком скетче выводятся постоянно ноли, когда 79 не в коменте то нет чего но строка бежит.
#include <OneWire.h> #include <Wire.h> OneWire ds(5); //пин для датчиков byte addr1[8]={0x28,0xFF,0xC8,0x8A,0xC2,0x15,0x01,0xC7}; // byte addr2[8]={0x28,0xFF,0x66,0x18,0xC2,0x15,0x02,0x52}; // byte addr3[8]={0x28, 0xFF, 0xAA, 0xDB, 0xA2, 0x16, 0x04, 0xCD}; // volatile int temp1,temp2,temp3; #include "RTClib.h" RTC_DS1307 RTC; #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3f, 16, 2); #if defined(ARDUINO) && ARDUINO >= 100 #define printByte(args) write(args); #else #define printByte(args) print(args,BYTE); #endif int analog = A0; //пульт руль int Gabarit = 2; //вход lsd int LedLsd = 6; //выход lsd int inPin = 3; //газ int analogInput = A6; //вход для вольтметра float vin = 0; // ВХОДНОЕ ЕАПРЯЖЕНИЕ //Символ градуса byte grad[8] = { 0b01100, 0b10010, 0b10010, 0b01100, 0b00000, 0b00000, 0b00000, 0b00000 }; void setup(void) { Serial.begin(9600); WDTCSR=(1<<WDCE)|(1<<WDE); //установить биты WDCE WDE (что б разрешить запись в другие биты WDTCSR=(1<<WDIE)| (1<<WDP2)|(1<<WDP1); // разрешение прерывания + выдержка 1 секунда // снять все ремарки если нужно поменять разрешение // ds.reset(); // сброс шины // ds.select(addr2); //выставить адрес // ds.write(0x4E); // разрешение записать конфиг // ds.write(0x7F); // Th контроль температуры макс 128грд // ds.write(0xFF); //Tl контроль температуры мин -128грд // ds.write(0x60); // 0x60 12-бит разрешение, 0x00 -9бит разрешение pinMode(8, INPUT); pinMode(9, INPUT); pinMode(10, INPUT); pinMode(11, INPUT); pinMode(12, INPUT); pinMode(analogInput, INPUT); //пин А6 как вход pinMode(LedLsd, OUTPUT); //пин 6 как выход для LSD pinMode(Gabarit, INPUT); //пин 2 как вход от габаритов для LSD lcd.init(); // Инициализация lcd lcd.backlight(); // Включаем подсветку lcd.createChar(0, grad); //Символ градуса lcd.setCursor(4, 0); //курсор lcd.print("Hello :)"); //надпись при включении lcd.setCursor(3, 1); //курсор lcd.print("Good day."); //надпись при включении delay(1500); //задержка lcd.clear(); //очистить екран Wire.begin(); RTC.begin(); if (! RTC.isrunning()) { //RTC.adjust(DateTime(__DATE__, __TIME__)); } } void loop() { //часы DateTime now = RTC.now(); lcd.setCursor(11, 0); char buff[6]; Serial.print(now.hour()); Serial.print(now.minute()); sprintf(buff, "%02d:%02d", now.hour(), now.minute()); lcd.println(buff); //газ if (digitalRead(inPin)) { lcd.setCursor(5, 0); lcd.print("GAZ"); } else { lcd.setCursor(5, 0); lcd.print(" - "); } lcd.setCursor(0, 0); //темп салон lcd.print(""); lcd.print(temp2/16); lcd.printByte(0); lcd.setCursor(0, 1); //темп улица lcd.print(""); lcd.print(temp1/16); lcd.printByte(0); lcd.setCursor(5, 1); //темп двигатель lcd.print(""); lcd.print(temp3/16); lcd.printByte(0); //вольтметр vin = float(analogRead(analogInput))/18.3; //подстроичное число для показа вольтметра lcd.setCursor(11, 1); lcd.print(""); lcd.print(vin, 1); lcd.print("V"); analog=analogRead(14); //считываем сигнал с пина АЦП if(analog>750&&analog<820) // k1 - up { pinMode(8, OUTPUT); digitalWrite(8,LOW); delay(50); pinMode(8, INPUT); delay(150); } if(analog>300&&analog<400) //k2 - right { pinMode(9, OUTPUT); digitalWrite(9,LOW); delay(50); pinMode(9, INPUT); delay(150); } if(analog>200&&analog<290) //k3 down { pinMode(10, OUTPUT); digitalWrite(10,LOW); delay(50); pinMode(10, INPUT); delay(150); } if(analog>100&&analog<190) //k4 vol+ { // для енкодера pinMode(11, OUTPUT); pinMode(12, OUTPUT); digitalWrite(11, HIGH); delay(25); digitalWrite(12, HIGH); delay(25); digitalWrite(11,LOW); delay(25); digitalWrite(12,LOW); delay(25); pinMode(11, INPUT); pinMode(12, INPUT); } if(analog>=0&&analog<80) //k5 vol- { // для енкодера pinMode(12, OUTPUT); pinMode(11, OUTPUT); digitalWrite(12, HIGH); delay(25); digitalWrite(11, HIGH); delay(25); digitalWrite(12,LOW); delay(25); digitalWrite(11,LOW); delay(25); pinMode(12, INPUT); pinMode(11, INPUT); } } ISR (WDT_vect){ //вектор прерывания WD static boolean n=0; // флаг работы: запрос температуры или её чтение n=!n; if (n) {ds.reset(); // сброс шины ds.write(0xCC);//обращение ко всем датчикам ds.write(0x44);// начать преобразование (без паразитного питания) } else {ds.reset(); ds.select(addr1); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp1 = ds.read() | (ds.read()<<8); //прочитаны 2 байта // получение с 2-го датчика ds.reset(); ds.select(addr2); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp2 = ds.read() | (ds.read()<<8); //прочитаны 2 байта ds.reset(); ds.select(addr3); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp3 = ds.read() | (ds.read()<<8); //прочитаны 2 байта } }при вот таком скетче выводятся постоянно ноли,
Ну, вот Вам и ответ. Виновата не печать, а то, что у Вас часы неправильно показывают.