Часы 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 день,сегодня.
В другие дни не заходил. Как писать не знал.
С телефона я не нашел возможности исправить,сделаю это завтра.
Спасибо за замечание.
Возможности исправить нет. Выложите код новым комментарием.
Исправлю завтра вставку кода.
Так всё плохо?
Как исправить? Хотя бы наводку.
Хорошо,спасибо.
Ребята, помогите пожалуйста новичку. Слепил скетч, не могу на LSD 1602 вывести дни недели. Один раз слуыайно получилось, потом исчезло... Я в этом чайник, если где неправильно, поправте пожалуйста.
Ребята, помогите пожалуйста новичку. Слепил скетч, не могу на LSD 1602 вывести дни недели. Один раз слуыайно получилось, потом исчезло... Я в этом чайник, если где неправильно, поправте пожалуйста.
Здравствуйте, помогите разобраться с проблемой отображения времени DS1307 на LCD1602, I2C. Это мой как-бы первый проект, учусь на своих же ошибках, буду очень признателен если ткнете носом на мои ошибки.)
Скетч с примера отображает хорошо, а когда скрещиваю его с своим то при первом включении на несколько сек. время выводиться, а далее как нв фото(верхний правый угол). Нужно только часы и минуты.
Честно говоря, не понял, что означает Ваше "а далее как нв фото". Вас не устраивает, что печать сбивается? Так Вы же печатаете просто числа, и если число двузначное, то всё в порядке, но как только оно становится однозначным, оно печаатается на месте левой цифры, а правая остаётся на месте, её никто не стирает.
Если памяти хватает, то вместо строк 94-96 напишите
Если начнёт ругаться, что типа sprintf не объявлен, добавьте в начале #include <stdio.h>
Заменил строки как Вы и сказали, ни на что не ругался скетч, так что библиотеку не добавлял.
Теперь при запуске на пару секунд показывает реальное время, а потом "00:00" и начинает кожен раз заново идти, тоисть "00:01" через минуту "00:02" и так далее.
Хотел попробовать добавит библиотеку #include но времени не хватило, будит ли с ней толк или нет?
СПС.
Думаю, что с показом это никак не связано, ошибка в другом, но чтобы убедитсья и быть уверенным, поставьте перед sprintf вывод в сериал значений now.hour() и now.minute().
Скажите, что там выводится. Тоже, что на часах или нет.
И заодно давайте текущую версию скетча.
Ок, завтра постараюсь сделать, щас ПК нет. СПС.
вот скетч на данній момент
Вы в курсе, что у Вас делает 79-я строка?
в порте пишет постоянно 5555555....
синхронизирует с пк время и дату.
при выводе 79 строки в комент на ЛСД начинают лезьт кряказябры...)
синхронизирует с пк время и дату.
при выводе 79 строки в комент на ЛСД начинают лезьт кряказябры...)
Нет. Она устанавливает в часах время компиляции скетча. И так каждый раз при включении Ардуино. Вот у Вас часы и начинают идти каждый раз с одного и того же времени. Перезальете скетч - это время меняется.
Нужно один раз залить и запустить скетч с этой строкой. А потом закомментировать её и залить скетч без этой строки. Пользоваться.
После этого разбираться с отображением.
проблема в том что время время показывается пару сек и пропадает, а вместо времени 00:00.
в порте пишет постоянно 5555555....
Блин, Вы издеваетесь?
Я Вас что просил напечатать? Значения now.hour() и now.minute(). Понимаете? Значения! Чему они равны!
А Вы что печатаете?
Serial
.print(sprintf(buff,
"%02d:%02d"
, now.hour(), now.minute()));
Длину буфера buff? Так я и без Вас знаю, что она 5 равна.
Напечатайте то, что я просил.
сори, неверно понял((((
при вот таком скетче выводятся постоянно ноли, когда 79 не в коменте то нет чего но строка бежит.
при вот таком скетче выводятся постоянно ноли,
Ну, вот Вам и ответ. Виновата не печать, а то, что у Вас часы неправильно показывают.