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

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

Метки:
  1. Slaiterx

    Slaiterx Гик

    Часы настроил запустил но не знаю как сделать чтобы отображали температуру с встроенного датчика часов
    и прикрутить кнопки для настройки.Сильно не пинайте это мой первый проект в жизни
    Вот код


    #include <Wire.h>
    #include "TM1637.h"

    #define DS1307_I2C_ADDRESS 0x68

    #define CLK 6
    #define DIO 7

    TM1637 tm1637(CLK,DIO);

    ///// часы ..
    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());
    }

    void setup() {
    Wire.begin();
    tm1637.init();
    tm1637.set(7); // яркость, от 0 до 7
    tm1637.point(POINT_ON); // включаем точки
    /* // установка часов
    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
    second = 30;
    minute = 0;
    hour = 14;
    dayOfWeek = 3; // день недели
    dayOfMonth = 1; // день
    month = 4;
    year = 14;

    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);

    int8_t TimeDisp[4];
    TimeDisp[0] = hour / 10;
    TimeDisp[1] = hour % 10;
    TimeDisp[2] = minute / 10;
    TimeDisp[3] = minute % 10;
    tm1637.display(TimeDisp);

    }
     
  2. Slaiterx

    Slaiterx Гик

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

    #define DS1307_I2C_ADDRESS 0x68

    #define CLK 2
    #define DIO 3

    TM1637 tm1637(CLK,DIO);

    ///// часы ..
    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.send(0x11);
    Wire.endTransmission();
    Wire.requestFrom(0x68, 2);

      if(Wire.available()) {
        tMSB = Wire.receive(); //2's complement int portion
        tLSB = Wire.receive(); //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(7); // яркость, от 0 до 7


    }

    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 <= 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
      {
        tm1637.point(POINT_ON); // включаем точки
        TimeDisp[0] = hour / 10;
        TimeDisp[1] = hour % 10;
        TimeDisp[2] = minute / 10;
        TimeDisp[3] = minute % 10;      
      }
     
      tm1637.display(TimeDisp); // отправляем массив на экран
     
    }
    Добавил в код показ температуры а скомпилировать не могу помогите понять что не так
     
  3. Tomasina

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

    Wire.receive замени на Wire.read
    Wire.send замени на Wire.write
     
    Slaiterx нравится это.
  4. Slaiterx

    Slaiterx Гик

    спасибо большое все заработало
     
  5. Slaiterx

    Slaiterx Гик

    отличные получились часы код может кому и пригодится отдельное спасибо Tomasina за помощь в написании кода

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

    #define DS1307_I2C_ADDRESS 0x68

    #define CLK 2
    #define DIO 3

    TM1637 tm1637(CLK,DIO);

    ///// часы ..
    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(4); // яркость, от 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(){
    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
      {
        tm1637.point(POINT_ON); // включаем точки
        TimeDisp[0] = hour / 10;
        TimeDisp[1] = hour % 10;
        TimeDisp[2] = minute / 10;
        TimeDisp[3] = minute % 10;      
      }
      tm1637.display(TimeDisp); // отправляем массив на экран
    }
     

    Вложения:

    • zclock2.ino
      Размер файла:
      3,4 КБ
      Просмотров:
      984
  6. Slaiterx

    Slaiterx Гик

    кто нибудь помогите прикрутить фоторезистор чтоб яркостью дисплея управлять а то ночью жесть как ярко светят
     
  7. Tomasina

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

    Код (C++):
    tm1637.set(map(analogRead(A0), 0, 1023, 1, 7));
    Вставить в loop().
     
  8. Slaiterx

    Slaiterx Гик

    и опять спасибо все заработало код прилагается
    Код (C++):
    #include <Wire.h>
    #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 = 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); // выключаем точки
        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
      {
        tm1637.point(POINT_ON); // включаем точки
        TimeDisp[0] = hour / 10;
        TimeDisp[1] = hour % 10;
        TimeDisp[2] = minute / 10;
        TimeDisp[3] = minute % 10;      
      }

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

    }
     
    Последнее редактирование: 1 май 2016
  9. Tomasina

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

    по-моему, вот это
    Код (C++):
    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)
    можно заменить на это:
    Код (C++):
    if (second % 10 == 0)
     
  10. Slaiterx

    Slaiterx Гик

    Попробую но так можно закоментировать строки и отображается по другому
     
  11. Slaiterx

    Slaiterx Гик

    Хочу добавить датчик температуры DS18B20 А то датчик в часах показывает явно завышенную температуру нашел код под DHT11 как соединить незнаю пробовал нечего не выходит
    Код (C++):
    #include <dht11.h>
    #include "TM1637.h"
    //{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    //0~9,A,b,C,d,E,F
    #define dht_pin 2 // Pin sensor is connected to
    #define CLK 3//Pins for TM1637      
    #define DIO 4
    TM1637 tm1637(CLK,DIO);
    dht11 DHT11;
    void setup(){
     
       Serial.begin(9600);
      tm1637.init();
      tm1637.set(BRIGHT_TYPICAL);
      //BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
      delay(1500);//Delay to let system boot
    }//end "setup()"
    void loop(){
      //Start of Program

      DHT11.read(dht_pin);
    int temp = DHT11.temperature;
    int humidity = DHT11.humidity;
      Serial.println(temp);
    int digitoneT = temp / 10;
    int digittwoT = temp % 10;
    int digitoneH = humidity / 10;
    int digittwoH = humidity % 10;
       Serial.print(digitoneT);
       Serial.println(digittwoT);
        tm1637.display(0,digitoneT);
        tm1637.display(1,digittwoT);
       
        tm1637.display(3,12);  // put a C at the end

       
        delay (3000);
       
        //tm1637.display(1,23);
        //tm1637.display(2,digitoneH);
        //tm1637.display(3,digittwoH);
       
      //Wait 3 seconds before accessing sensor again.
      //Fastest should be once every two seconds.
        //delay(3000);
    }
     
  12. Securbond

    Securbond Гуру

    Может глянуть в сторону библиотеки dallasTemperature ?
    Посмотрите - может поможет http://forum.amperka.ru/threads/Часы-с-функцией-включения-ночного-света.7215/
     
  13. Slaiterx

    Slaiterx Гик

    У меня дисплей другой я принцип хочу понять вывода на мой дисплей седня попробую код переписать посмотрю может чего и получится наметки вроде есть в башке
     
  14. ZAZ-965

    ZAZ-965 Гуру

  15. Tomasina

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

    зачем для этого целая библиотека?
    Код (C++):
    float temperature;

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

    Slaiterx Гик

    Мне бы с библиотекой проще было бы седня вечером попробую и так и так ох неуверен я в своих силах и познаниях
     
  17. Tomasina

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

    элементарно, Ватсон ;)
    Код (C++):
    #include <OneWire.h>
    #include "TM1637.h"
    //{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    //0~9,A,b,C,d,E,F
    #define CLK_PIN      3  // пин для подключения модуля часов
    #define DIO_PIN      4  // пин для подключения модуля часов
    #define ONE_WIRE_PIN 10 // пин для подключения DS18B20

    float temperature;

    TM1637 tm1637(CLK_PIN, DIO_PIN);
    OneWire oneWire(ONE_WIRE_PIN);

    void setup()
    {
      Serial.begin(9600);
      tm1637.init();
      tm1637.set(BRIGHT_TYPICAL);
      //BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
    }//end setup()


    void loop()
    {
      readDS18B20();
      Serial.println(temperature);
      tm1637.display(0, (int)temperature / 10);
      tm1637.display(1, (int)temperature % 10);
      tm1637.display(3, 12); // put a C at the end
      delay (3000);
    }


    // читаем датчик 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 (чтение регистров)
        temperature = (oneWire.read() | oneWire.read() << 8) / 16.0; //прочитаны 2 байта
      }
    }
     
  18. Slaiterx

    Slaiterx Гик

    Как это к часам прикрутить пробывал невыходит чето а по отдельности все работает короче нехватает мне еще познаний
     
  19. Tomasina

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

    Где код для часов?
     
  20. Slaiterx

    Slaiterx Гик

    Код (C++):
    #include <Wire.h>
    #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 = 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); // выключаем точки
        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
      {
        tm1637.point(POINT_ON); // включаем точки
        TimeDisp[0] = hour / 10;
        TimeDisp[1] = hour % 10;
        TimeDisp[2] = minute / 10;
        TimeDisp[3] = minute % 10;    
      }

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

    }
    Последнее редактирование: 1 май 2016
    1 май 2016 РедактироватьУдалитьПожаловатьсяОтветить
    Tomasina