часы с температурой на DS3231 и 2х. дисплеях TM1637 на одном дисплее часы на другом температура

Тема в разделе "Arduino & Shields", создана пользователем Slaiterx, 8 апр 2016.

Метки:
  1. Slaiterx

    Slaiterx Гик

    Вот код от часов правда там еще к а0 фотодиод подключен и незакоментирован забыл
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (C++):
    #include <OneWire.h>
    #include <Wire.h>
    #include "TM1637.h"

    #define ONE_WIRE_PIN 10 // пин для подключения DS18B20
    OneWire oneWire(ONE_WIRE_PIN);

    #define DS1307_I2C_ADDRESS 0x68

    //подключение дисплея
    #define CLK_TM1637 2
    #define DIO_TM1637 3
    TM1637 tm1637(CLK_TM1637,DIO_TM1637);

    //подключение часов
    #define CLK А5
    #define DIO А4

    float temp; // переменная для хранения температуры


    void setup()
    {
      Wire.begin();
      tm1637.init();
      tm1637.set(0); // яркость, от 0 до 7

      /* // установка часов
       byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
       second = 0;
       minute = 59;
       hour = 21;
       dayOfWeek = 1; // день недели
       dayOfMonth = 11; // день
       month = 4;
       year = 16;
     
       setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
       */


    }

    void loop()
    {
      tm1637.set(map(analogRead(A0), 0, 1023, 1, 7)); // непонятно зачем это. Возможно, регулировка яркости дисплея
      byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
      getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

      //byte temp = get3231Temp();  // остатки старого проекта

      int8_t TimeDisp[4];

      // вывод температуры .. каждые 10 сек на 2 сек
      if (second >= 0 && second <= 1 ||
        second >= 10 && second <= 11 ||
        //second >= 20 && second <= 21 ||
      second >= 30 && second <= 31 ||
        //second >= 40 && second <= 41 ||
      second >= 50 && second <= 51)
      {
        tm1637.point(POINT_OFF); // выключаем точки
        readDS18B20();           // считываем температуру
        TimeDisp[0] = 19; //
        TimeDisp[1] = (byte)temp / 10; // заполняем массив
        TimeDisp[2] = (byte)temp % 10;
        TimeDisp[3] = 12; // C

      }
      //дата  else if(second >= 25 && second <= 26 ||          second >= 45 && second <= 46)  {    tm1637.point(POINT_OFF);      TimeDisp[0] = dayOfMonth / 10;    TimeDisp[1] = dayOfMonth % 10;    TimeDisp[2] = month / 10;    TimeDisp[3] = month % 10;    }
      /// часы
      else
      {
        tm1637.point(POINT_ON); // включаем точки
        TimeDisp[0] = hour / 10;
        TimeDisp[1] = hour % 10;
        TimeDisp[2] = minute / 10;
        TimeDisp[3] = minute % 10;  
      }

      tm1637.display(TimeDisp); // отправляем массив на экран

    }

    ///// часы ..
    byte decToBcd(byte val)
    {
      return ( (val/10*16) + (val%10) );
    }

    byte bcdToDec(byte val)
    {
      return ( (val/16*10) + (val%16) );
    }

    void setDateDs1307(byte second, // 0-59
    byte minute, // 0-59
    byte hour, // 1-23
    byte dayOfWeek, // 1-7
    byte dayOfMonth, // 1-28/29/30/31
    byte month, // 1-12
    byte year) // 0-99
    {
      Wire.beginTransmission(DS1307_I2C_ADDRESS);
      Wire.write(0);
      Wire.write(decToBcd(second));
      Wire.write(decToBcd(minute));
      Wire.write(decToBcd(hour));
      Wire.write(decToBcd(dayOfWeek));
      Wire.write(decToBcd(dayOfMonth));
      Wire.write(decToBcd(month));
      Wire.write(decToBcd(year));
      Wire.endTransmission();
    }

    void getDateDs1307(byte *second,
    byte *minute,
    byte *hour,
    byte *dayOfWeek,
    byte *dayOfMonth,
    byte *month,
    byte *year)
    {
      Wire.beginTransmission(DS1307_I2C_ADDRESS);
      Wire.write(0);
      Wire.endTransmission();

      Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

      *second = bcdToDec(Wire.read() & 0x7f);
      *minute = bcdToDec(Wire.read());
      *hour = bcdToDec(Wire.read() & 0x3f);
      *dayOfWeek = bcdToDec(Wire.read());
      *dayOfMonth = bcdToDec(Wire.read());
      *month = bcdToDec(Wire.read());
      *year = bcdToDec(Wire.read());
    }

    /* //старое - чтение температуры с DS3231
    float get3231Temp()
    {
      byte tMSB, tLSB;
      float temp3231;

      Wire.beginTransmission(0x68);
      Wire.write(0x11);
      Wire.endTransmission();
      Wire.requestFrom(0x68, 2);

      if(Wire.available()) {
        tMSB = Wire.read(); //2's complement int portion
        tLSB = Wire.read(); //fraction portion

        temp3231 = (tMSB & B01111111); //do 2's math on Tmsb
        temp3231 += ( (tLSB >> 6) * 0.25 ); //only care about bits 7 & 8
      }
      else {
        //oh noes, no data!
      }

      return temp3231;
    }
    */


    /////////////////
    // читаем датчик DS18B20. Для DS18S20 не подходит!
    // обращаемся к функции не чаще 1 раза в секунду.
    void readDS18B20()
    {
      static boolean n = false;     // флаг работы: запрос температуры или её чтение
      n = !n;
      if (n)
      {
        oneWire.reset();                 // сброс шины
        oneWire.write(0xCC);             //обращение ко всем датчикам (если всего один DS18B20)
        //oneWire.select(sensorAddress); // выбор конкретного адреса - если несколько DS18B20
        oneWire.write(0x44);             // начать преобразование (без паразитного питания)
      }
      else
      {
        oneWire.reset();                 // сброс шины
        oneWire.write(0xCC);             //обращение ко всем датчикам (если всего один DS18B20)
        //oneWire.select(sensorAddress); // выбор конкретного адреса - если несколько DS18B20
        oneWire.write(0xBE);             // Read Scratchpad (чтение регистров)
        temp = (oneWire.read() | oneWire.read() << 8) / 16.0; //прочитаны 2 байта
      }
    }
     
  3. Slaiterx

    Slaiterx Гик

    Да у меня подключен фоторезистор на А0 он изменяет яркость дисплея автоматически чтобы ночью в глаза не светили
     
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    наверное лучше перенести строчку tm1637.set... вниз - перед tm1637.point(POINT_ON);
    А то сейчас он измеряет освещенность и устанавливает яркость дисплея несколько тысяч раз в секунду, мой феншуй протестует :)
     
  5. Slaiterx

    Slaiterx Гик

    Прислушаюсь к совету перенесу
     
  6. Slaiterx

    Slaiterx Гик

    спасибо все работает
     
  7. Игорь2016

    Игорь2016 Нерд

    Уважаемый. Подскажи, на какие пины ты кнопки прикрутил? Что то в скетче я их не вижу.
     
  8. Danil25

    Danil25 Нуб

    Товарищи!) Подскажите! Я хочу подключить датчиками температуры Ds18b20 к Arduino! http://proumnyjdom.ru/kontrollery/ds18b20-podklyuchenie-k-arduino.html Если еще добавить дисплей это будет здорово! Только как это все лучше срастить? питания одино или объединить? например, GND с двух источников? И не пойму почему у меня сейчас сам датчик температуру не точно показывает( погрешность в 2 градуса это норм? Сравнивал с эл.градусником!
     
  9. Tomasina

    Tomasina Сушитель лампочек Модератор

    электронный градусник - это не эталон, тоже может врать.
     
  10. Slaiterx

    Slaiterx Гик

    сделал часы с двумя дисплеями TM1637 Ардуино нано и часах реального времени
    Код (C++):
    #include <Wire.h>
    #include "TM1637.h"

    #define DS1307_I2C_ADDRESS 0x68

    //#define CLK 3
    //#define DIO 2

    //TM1637 tm1637(CLK,DIO);
    TM1637 tm1637(3,2);
    TM1637 tm16371(5,4);
    ///// часы ..
    byte decToBcd(byte val){
    return ( (val/10*16) + (val%10) );
    }

    byte bcdToDec(byte val){
    return ( (val/16*10) + (val%16) );
    }

    void setDateDs1307(byte second, // 0-59
    byte minute, // 0-59
    byte hour, // 1-23
    byte dayOfWeek, // 1-7
    byte dayOfMonth, // 1-28/29/30/31
    byte month, // 1-12
    byte year) // 0-99
    {
    Wire.beginTransmission(DS1307_I2C_ADDRESS);
    Wire.write(0);
    Wire.write(decToBcd(second));
    Wire.write(decToBcd(minute));
    Wire.write(decToBcd(hour));
    Wire.write(decToBcd(dayOfWeek));
    Wire.write(decToBcd(dayOfMonth));
    Wire.write(decToBcd(month));
    Wire.write(decToBcd(year));
    Wire.endTransmission();
    }

    void getDateDs1307(byte *second,
    byte *minute,
    byte *hour,
    byte *dayOfWeek,
    byte *dayOfMonth,
    byte *month,
    byte *year)
    {

    Wire.beginTransmission(DS1307_I2C_ADDRESS);
    Wire.write(0);
    Wire.endTransmission();

    Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

    *second = bcdToDec(Wire.read() & 0x7f);
    *minute = bcdToDec(Wire.read());
    *hour = bcdToDec(Wire.read() & 0x3f);
    *dayOfWeek = bcdToDec(Wire.read());
    *dayOfMonth = bcdToDec(Wire.read());
    *month = bcdToDec(Wire.read());
    *year = bcdToDec(Wire.read());
    }

      float get3231Temp(){
      byte tMSB, tLSB;
      float temp3231;

    Wire.beginTransmission(0x68);
    Wire.write(0x11);
    Wire.endTransmission();
    Wire.requestFrom(0x68, 2);

      if(Wire.available()) {
        tMSB = Wire.read(); //2's complement int portion
        tLSB = Wire.read(); //fraction portion

        temp3231 = (tMSB & B01111111); //do 2's math on Tmsb
        temp3231 += ( (tLSB >> 6) * 0.25 ); //only care about bits 7 & 8
      }
      else {
        //oh noes, no data!
      }

      return temp3231;
    }
    /////////////////

    void setup() {
    Wire.begin();
    tm1637.init();
    tm1637.set(3); // яркость, от 0 до 7
    tm16371.init();
    tm16371.set(1);
       /* //установка часов
      byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
      second = 45;
      minute = 38;
      hour = 22;
      dayOfWeek = 2; // день недели
      dayOfMonth = 17; // день
      month = 1;
      year = 17;

      setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);

    */

    }

    void loop(){
    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
      getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
      byte temp = get3231Temp();
      int8_t TimeDisp[4];
      // вывод температуры .. каждые 10 сек на 2 сек
      /*if (second >= 0 && second <= 2 ||
          second >= 10 && second <= 12 ||
          second >= 20 && second <= 22 ||
          second >= 30 && second <= 32 ||
          second >= 40 && second <= 42 ||
          second >= 50 && second <= 52)
      {*/

        tm16371.point(POINT_OFF); // выключаем точки
        TimeDisp[0] = 19; //
        TimeDisp[1] = temp / 10; // заполняем массив
        TimeDisp[2] = temp % 10;
        TimeDisp[3] = 12; // C

    tm16371.display(TimeDisp);


        tm1637.point(POINT_ON); // включаем точки
        TimeDisp[0] = hour / 10;
        TimeDisp[1] = hour % 10;
        TimeDisp[2] = minute / 10;
        TimeDisp[3] = minute % 10;    

    tm1637.display(TimeDisp); // отправляем массив на экран
    }
    может кому пригодится
     
    medved323, 9xA59kK и Tomasina нравится это.
  11. Tols

    Tols Нуб

    Повторил ваши часики. Все работает. А как установить время? Я начинающий
     
  12. Slaiterx

    Slaiterx Гик

    РАСКОМЕНТИРУЙ КУСОК КОДА
    Код (C++):
       /* //установка часов
      byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
      second = 45;
      minute = 38;
      hour = 22;
      dayOfWeek = 2; // день недели
      dayOfMonth = 17; // день
      month = 1;
      year = 17;

      setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);

    */
    ПОСТАВЬ ВРЕМЯ И ДАТУ ПОСЛЕ ЗАЛЕЙ В АРДУИНУ ПОТОМ ОБРАТНО ЗАКОМЕНТИРУЙ И СНОВА ЗАЛЕЙ ИНАЧЕ ПРИ РЕСТАРТЕ АРДУИНЫ БУДЕТ ВРЕМЯ УСТАНОВКИ
     
  13. Tols

    Tols Нуб

    Спасибо. Все получилось.
     
  14. Slaiterx

    Slaiterx Гик

    всегда пожалуйста
     
  15. ivanovich2004

    ivanovich2004 Нуб

    Подскажите как моргать точками при выводе времени и как вместо буквы "С" вывести десятые доли градуса. Целочисленное деление мне не помогло..
     
  16. Slaiterx

    Slaiterx Гик

    У меня на модуле точки не подключены
     
  17. ivanovich2004

    ivanovich2004 Нуб

    Тогда зачем в коде строки:
    tm1637.point(POINT_ON);
    tm1637.point(POINT_OFF);
     
  18. Slaiterx

    Slaiterx Гик

    Писал код давно сейчас гляну точками мигал в другом проекте тоже часы но с одним дисплеем
     
  19. Slaiterx

    Slaiterx Гик

    Код (C++):
    #include <Wire.h>
    #include "TM1637.h"

    #define DS1307_I2C_ADDRESS 0x68

    //подключение дисплея
    #define CLK 2
    #define DIO 3
    TM1637 tm1637(CLK,DIO);

    //подключение часов
    #define CLK А5
    #define DIO А4


    ///// часы ..
    byte decToBcd(byte val){
    return ( (val/10*16) + (val%10) );
    }

    byte bcdToDec(byte val){
    return ( (val/16*10) + (val%16) );
    }

    void setDateDs1307(byte second, // 0-59
    byte minute, // 0-59
    byte hour, // 1-23
    byte dayOfWeek, // 1-7
    byte dayOfMonth, // 1-28/29/30/31
    byte month, // 1-12
    byte year) // 0-99
    {
    Wire.beginTransmission(DS1307_I2C_ADDRESS);
    Wire.write(0);
    Wire.write(decToBcd(second));
    Wire.write(decToBcd(minute));
    Wire.write(decToBcd(hour));
    Wire.write(decToBcd(dayOfWeek));
    Wire.write(decToBcd(dayOfMonth));
    Wire.write(decToBcd(month));
    Wire.write(decToBcd(year));
    Wire.endTransmission();
    }

    void getDateDs1307(byte *second,
    byte *minute,
    byte *hour,
    byte *dayOfWeek,
    byte *dayOfMonth,
    byte *month,
    byte *year)
    {

    Wire.beginTransmission(DS1307_I2C_ADDRESS);
    Wire.write(0);
    Wire.endTransmission();

    Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

    *second = bcdToDec(Wire.read() & 0x7f);
    *minute = bcdToDec(Wire.read());
    *hour = bcdToDec(Wire.read() & 0x3f);
    *dayOfWeek = bcdToDec(Wire.read());
    *dayOfMonth = bcdToDec(Wire.read());
    *month = bcdToDec(Wire.read());
    *year = bcdToDec(Wire.read());
    }

      float get3231Temp(){
      byte tMSB, tLSB;
      float temp3231;

    Wire.beginTransmission(0x68);
    Wire.write(0x11);
    Wire.endTransmission();
    Wire.requestFrom(0x68, 2);

      if(Wire.available()) {
        tMSB = Wire.read(); //2's complement int portion
        tLSB = Wire.read(); //fraction portion

        temp3231 = (tMSB & B01111111); //do 2's math on Tmsb
        temp3231 += ( (tLSB >> 6) * 0.25 ); //only care about bits 7 & 8
      }
      else {
        //oh noes, no data!
      }

      return temp3231;
    }
    /////////////////

    void setup() {
    Wire.begin();
    tm1637.init();
    tm1637.set(0); // яркость, от 0 до 7

        // установка часов
      //byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
      //second = 0;
      //minute = 8;
      //hour = 23;
      //dayOfWeek = 7; // день недели
      //dayOfMonth = 28; // день
      //month = 5;
      //year = 16;

      //setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);

    }

    void loop(){
     
    tm1637.set(map(analogRead(A0), 0, 1023, 1, 7));
    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
      getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
    // byte temp = get3231Temp();
      //int8_t TimeDisp[4];
      // вывод температуры .. каждые 10 сек на 2 сек
    // if (second >= 0 && second <= 1 ||
          //second >= 10 && second <= 11 ||
          //second >= 20 && second <= 21 ||
          //second >= 30 && second <= 31 ||
          //second >= 40 && second <= 41 ||
          //second >= 50 && second <= 51)
    // {
        //tm1637.point(POINT_OFF); // выключаем точки
        //TimeDisp[0] = 19; //
       // TimeDisp[1] = temp / 10; // заполняем массив
        //TimeDisp[2] = temp % 10;
       // TimeDisp[3] = 12; // C

    // }
       //дата  else if(second >= 25 && second <= 26 ||          second >= 45 && second <= 46)  {    tm1637.point(POINT_OFF);      TimeDisp[0] = dayOfMonth / 10;    TimeDisp[1] = dayOfMonth % 10;    TimeDisp[2] = month / 10;    TimeDisp[3] = month % 10;    }
      /// часы
    // else
      //{
       
        int8_t TimeDisp[4];
        if (second % 1 == 0)
        tm1637.point(POINT_ON);
       if (second % 2 == 0)
      tm1637.point(POINT_OFF);
        TimeDisp[0] = hour / 10;
        TimeDisp[1] = hour % 10;
        TimeDisp[2] = minute / 10;
        TimeDisp[3] = minute % 10;      
      //}
      tm1637.display(TimeDisp); // отправляем массив на экран
    }
     
    medved323 нравится это.
  20. Slaiterx

    Slaiterx Гик

    вот код для одного дисплея с мигающими точками