Перезалив 1307

kyrios
Offline
Зарегистрирован: 29.12.2015

Помогите найти баг скетча или что там происходит.Не выводит время (дс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; // если символ не из списка, то отображаем подчеркивание
}

 

ankurmanov
Offline
Зарегистрирован: 03.07.2016

Temp = (float)raw / 16.0 не заполняется значением с датчика? Или led7print(dbuffer) не выводит значения?

ankurmanov
Offline
Зарегистрирован: 03.07.2016

Попробуем разобраться, но я сам 3 меяца назад первый раз это все увидел

kyrios
Offline
Зарегистрирован: 29.12.2015

Часы рабочие.Но индикации нет. показывает  01.01  Отключить 1307 - индикация не меняется.

kyrios
Offline
Зарегистрирован: 29.12.2015

Причина мне непонятна

ankurmanov
Offline
Зарегистрирован: 03.07.2016

Выводил на Serial время вместо дисплея?

kyrios
Offline
Зарегистрирован: 29.12.2015

ankurmanov пишет:

Выводил на Serial время вместо дисплея?

В порт? Не вышло(не вывело)

ankurmanov
Offline
Зарегистрирован: 03.07.2016

Получается дисплей работает часы не работают?

kyrios
Offline
Зарегистрирован: 29.12.2015

ankurmanov пишет:

Получается дисплей работает часы не работают?

Температуру показывает.Поочередно с бредом,где время быть должно

ankurmanov
Offline
Зарегистрирован: 03.07.2016

Почему тут case 0 : for (byte i=d; i<4; i++) {digit[i]=22;}; d=4; break;

22, если пробел 23?

ankurmanov
Offline
Зарегистрирован: 03.07.2016

А с временем сначала без всего прочего когда надо разобраться что бы Serial вывдил точно что надо

kyrios
Offline
Зарегистрирован: 29.12.2015

Спасибо,мне помог добрый человек.Если интересует могу скинуть для просмотра.

ankurmanov
Offline
Зарегистрирован: 03.07.2016

Отлично! Мне честно этот дисплей не удобным показался, на MAX7219 до него брао, не надо обновлять постоянно, думал этот такой же, не посмотрел когда заказывал на фото на али был такой же только цифры зеленые, на цвет и клюнул.

kyrios
Offline
Зарегистрирован: 29.12.2015

У меня красный.Брал и не предпологал о проблемах с ним