Перезалив 1307
- Войдите на сайт для отправки комментариев
Чт, 07/07/2016 - 13:01
Помогите найти баг скетча или что там происходит.Не выводит время (дс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; // если символ не из списка, то отображаем подчеркивание }
Temp = (float)raw / 16.0 не заполняется значением с датчика? Или led7print(dbuffer) не выводит значения?
Попробуем разобраться, но я сам 3 меяца назад первый раз это все увидел
Часы рабочие.Но индикации нет. показывает 01.01 Отключить 1307 - индикация не меняется.
Причина мне непонятна
Выводил на Serial время вместо дисплея?
Выводил на Serial время вместо дисплея?
В порт? Не вышло(не вывело)
Получается дисплей работает часы не работают?
Получается дисплей работает часы не работают?
Температуру показывает.Поочередно с бредом,где время быть должно
Почему тут case 0 : for (byte i=d; i<4; i++) {digit[i]=22;}; d=4; break;
22, если пробел 23?
А с временем сначала без всего прочего когда надо разобраться что бы Serial вывдил точно что надо
Спасибо,мне помог добрый человек.Если интересует могу скинуть для просмотра.
Отлично! Мне честно этот дисплей не удобным показался, на MAX7219 до него брао, не надо обновлять постоянно, думал этот такой же, не посмотрел когда заказывал на фото на али был такой же только цифры зеленые, на цвет и клюнул.
У меня красный.Брал и не предпологал о проблемах с ним