Часы DS1307

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; // если символ не из списка, то отображаем подчеркивание
}
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы ж вроде не первый день на форуме! Вставьте код нормально!

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

Я тут третий день. Буду иметь ввиду. А по делу есть комментарий?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kyrios пишет:
Я тут третий день.

Зарегистрирован: 29.12.2015. Длинные ж у Вас дни!

kyrios пишет:
А по делу есть комментарий?
Вы чего-то недопоняли. Я же Вам написал - Вставьте код нормальноВы это сделали?

А если нет, так какие могут быть комментарии? Вы всерьёз считаете, что сначала я буду разбирать трудночитаемый код, а потом ещё писать комментарии не имея возможности ссылаться на номера строк (или номера для ссылки пальцем отсчитывать)?

Никто Ваш код по делу не смотрел и смотреть не будет, пока не вставите его нормально.

Это и есть комментарий по делу.

fogary
Offline
Зарегистрирован: 05.03.2016

kyrios пишет:
А по делу есть комментарий?
Использование неверных типов данных, неправильно организованные проверки, некорректная работа с индексами массивов. Это только то, что удалось разглядеть.

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

1 день -зарегистрировался.
2 день-вчера задал вопрос.
3 день,сегодня.
В другие дни не заходил. Как писать не знал.
С телефона я не нашел возможности исправить,сделаю это завтра.
Спасибо за замечание.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Возможности исправить нет. Выложите код новым комментарием.

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

Исправлю завтра вставку кода.
Так всё плохо?
Как исправить? Хотя бы наводку.

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

Хорошо,спасибо.

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

// Термометр, часы 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]; // если символ не из списка, то отображаем подчеркивание
}

 

alex7106
Offline
Зарегистрирован: 05.02.2017

Ребята, помогите пожалуйста новичку. Слепил скетч, не могу на LSD 1602 вывести дни недели. Один раз слуыайно получилось, потом исчезло... Я в этом чайник, если где неправильно, поправте пожалуйста.

[code]
#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:;
           // на неизвестную команду - ничего не делаем
    };
  }
}
[/code]
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

alex7106 пишет:

Ребята, помогите пожалуйста новичку. Слепил скетч, не могу на LSD 1602 вывести дни недели. Один раз слуыайно получилось, потом исчезло... Я в этом чайник, если где неправильно, поправте пожалуйста.

 
Я понимаю, что воспользоваться поиском Вы не хотите и не умеете, но хотябы начало ЭТОГО поста Вы можете прочитать?
alex7106
Offline
Зарегистрирован: 05.02.2017

#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:;
           // на неизвестную команду - ничего не делаем
    };
  }
}

 

Katroha
Offline
Зарегистрирован: 28.02.2017

Здравствуйте, помогите разобраться с проблемой отображения времени 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 байта
       }


}
 
 

 

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Честно говоря, не понял, что означает Ваше "а далее как нв фото". Вас не устраивает, что печать сбивается? Так Вы же печатаете просто числа, и если число двузначное, то всё в порядке, но как только оно становится однозначным, оно печаатается на месте левой цифры, а правая остаётся на месте, её никто не стирает.

Если памяти хватает, то вместо строк 94-96 напишите

{
  char buff[6]; 
  sprintf(buff, "%02d:%02d", now.hour(), now.minute());
  lcd.print(buff);
}

Если начнёт ругаться, что типа sprintf не объявлен, добавьте в начале #include <stdio.h>

Katroha
Offline
Зарегистрирован: 28.02.2017

Заменил строки как Вы и сказали, ни на что не ругался скетч, так что библиотеку не добавлял.
Теперь при запуске на пару секунд показывает реальное время, а потом "00:00" и начинает кожен раз заново идти, тоисть "00:01" через минуту "00:02" и так далее.
Хотел попробовать добавит библиотеку #include но времени не хватило, будит ли с ней толк или нет?
СПС.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Думаю, что с показом это никак не связано, ошибка в другом, но чтобы убедитсья и быть уверенным, поставьте перед sprintf вывод в сериал значений now.hour() и now.minute().

Скажите, что там выводится. Тоже, что на часах или нет.

И заодно давайте текущую версию скетча.

Katroha
Offline
Зарегистрирован: 28.02.2017

Ок, завтра постараюсь сделать, щас ПК нет. СПС.

Katroha
Offline
Зарегистрирован: 28.02.2017

вот скетч на данній момент

#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 байта
       }


}
 
 
  
 

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Вы в курсе, что у Вас делает 79-я строка?

Katroha
Offline
Зарегистрирован: 28.02.2017

в порте пишет постоянно 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 байта
       }


}
 
 
  
 

 

Katroha
Offline
Зарегистрирован: 28.02.2017

синхронизирует с пк время и дату.

при выводе 79 строки в комент на ЛСД начинают лезьт кряказябры...)

kalapanga
Offline
Зарегистрирован: 23.10.2016

Katroha пишет:

синхронизирует с пк время и дату.

при выводе 79 строки в комент на ЛСД начинают лезьт кряказябры...)

Нет. Она устанавливает в часах время компиляции скетча. И так каждый раз при включении Ардуино. Вот у Вас часы и начинают идти каждый раз с одного и того же времени. Перезальете скетч - это время меняется.

Нужно один раз залить и  запустить скетч с этой строкой. А потом закомментировать её и залить скетч без этой строки. Пользоваться. 

После этого разбираться с отображением. 

Katroha
Offline
Зарегистрирован: 28.02.2017

проблема в том что время время показывается пару сек и пропадает, а вместо времени  00:00.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Katroha пишет:

в порте пишет постоянно 5555555....

Блин, Вы издеваетесь?

Я Вас что просил напечатать? Значения now.hour() и now.minute(). Понимаете? Значения! Чему они равны!

А Вы что печатаете?

Serial.print(sprintf(buff, "%02d:%02d", now.hour(), now.minute()));

Длину буфера buff? Так я и без Вас знаю, что она 5 равна.

Напечатайте то, что я просил.

Katroha
Offline
Зарегистрирован: 28.02.2017

сори, неверно понял((((

при вот таком скетче выводятся постоянно ноли, когда 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 байта
       }


}
 
 
  
 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Katroha пишет:

при вот таком скетче выводятся постоянно ноли,

Ну, вот Вам и ответ. Виновата не печать, а то, что у Вас часы неправильно показывают.