часы на DS3102 и 1"8 TFT LCD

Тема в разделе "Глядите, что я сделал", создана пользователем Пушной звер, 24 июл 2014.

  1. Пушной звер

    Пушной звер Оракул

    [​IMG]

    Иногда хочется заняться чем то бесполезными, вот к примеру таким,

    Код (Text):
    #include <TFT.h>  // Arduino LCD library
    #include <SPI.h>
    #include <DS1302.h> //https://codeload.github.com/msparks/arduino-ds1302/zip/master
    #define cs  10
    #define dc  9
    #define rst  8

    #define kCePin 6  // Chip Enable
    #define kIoPin 5  // Input/Output
    #define kSclkPin 4  // Serial Clock

    TFT TFTscreen = TFT(cs, dc, rst);
    DS1302 rtc(kCePin, kIoPin, kSclkPin);


    void setup() {
      pinMode(2, OUTPUT);
      pinMode(3, OUTPUT);
      digitalWrite(2, HIGH);
      digitalWrite(3, LOW);
      TFTscreen.begin();
    }

    String dayAsString(const Time::Day day) {
      switch (day) {
        case Time::kSunday: return "Sunday";
        case Time::kMonday: return "Monday";
        case Time::kTuesday: return "Tuesday";
        case Time::kWednesday: return "Wednesday";
        case Time::kThursday: return "Thursday";
        case Time::kFriday: return "Friday";
        case Time::kSaturday: return "Saturday";
      }
      return "(unknown day)";
    }

    void loop() {
      Time t = rtc.time();

      const String Day = dayAsString(t.day);

      char time[10];
      char data[11];
      char day[10];
      snprintf(time, sizeof(time), "%02d:%02d",        
              t.hr, t.min);
           
      snprintf(data, sizeof(data), "%02d/%02d/%02d",          
              t.date, t.mon, t.yr);
           
      snprintf(day, sizeof(day), "%s", Day.c_str());      

      TFTscreen.background(50, 0, 0);
      TFTscreen.setTextSize(5);
      TFTscreen.stroke(240, 220, 220);
      TFTscreen.text(time, 9, 20);

      TFTscreen.setTextSize(2);
      TFTscreen.stroke(200, 150, 150);
      TFTscreen.text(data, 20, 70);

      TFTscreen.setTextSize(2);
      TFTscreen.stroke(150, 150, 200);
      TFTscreen.text(day, 25, 100);
      delay(30000);

    }
     
    Karabas, dreadfull и altex нравится это.
  2. Securbond

    Securbond Гик

    Повторил Ваши часики на дигиспарке
    image.jpeg image.jpeg image.jpeg
    Осталось корпус придумать
     
    Пушной звер нравится это.
  3. Securbond

    Securbond Гик

    Ещё часики (Ваш код) на atmega8 . Как всегда до корпуса дело доходит в самый последний момент.

    9D252DD3-F6E6-4F40-A299-18F9A688BFB6.jpeg 811C3FCF-958D-470E-BAB2-EAF7544229F4.jpeg 627C9F3F-C15A-4078-9335-B0616A1779BD.jpeg ABD2CE0C-DD59-4D82-8366-FD2DE1852B14.jpeg


    Вот только мигание точек по прирыванию работало как то :confused:.. (может что то с контактом или наводки...
    сделал программно,
    Код (C++):
    if (second % 2 > 0) {  // нечётные секунды
      tm1637.point(POINT_ON); // включаем точки;
    }
         else tm1637.point(POINT_OFF); // выключаем точки
     
    Последнее редактирование: 2 окт 2017
    Пушной звер нравится это.
  4. Oleksandr54

    Oleksandr54 Нерд

    Securbond Скинь полностью скеч.
     
  5. Securbond

    Securbond Гик

    Пожалуйста ...
    Код (C++):

    #include <Wire.h>
    #include "TM1637.h"
    // 7сигментный индикатор
    #define CLK 6
    #define DIO 7
    #define brightness 5 // яркость, от 0 до 7
    // кнопки
    #define keySet 8
    #define keyHor 9
    #define keyMin 10

    TM1637 tm1637(CLK,DIO);
    #define DS3231_I2C_ADDRESS 0x68

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

    void setDateDs3231(
    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(DS3231_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 getDateDs3231(byte *second,
    byte *minute,
    byte *hour,
    byte *dayOfWeek,
    byte *dayOfMonth,
    byte *month,
    byte *year)
    {
    Wire.beginTransmission(DS3231_I2C_ADDRESS);
    Wire.write(0);
    Wire.endTransmission();
    Wire.requestFrom(DS3231_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();
    pinMode(keyHor, INPUT_PULLUP);
    pinMode(keyMin, INPUT_PULLUP);
    pinMode(keySet,  INPUT_PULLUP);
    tm1637.init();
    tm1637.set(brightness);
    }

    void loop(){
    // читаем время из модуля
    byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
    getDateDs3231(&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;
    // обработка кнопок
    if (!digitalRead(keyHor) && !digitalRead(keySet)){ // часы
    second = 0; // сбрасываем секунды
    hour++; // пребавляем единицу к часам
    if (hour > 23) hour = 0; // если вылезли за границы присваеваем 0
    setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year); // пишим в модуль
    delay(200);
    }
    if (!digitalRead(keyMin) && !digitalRead(keySet)){ // минуты
    second = 0;
    minute++;
    if (minute > 59) minute = 0;
    setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
    delay(200);
    }
    // мигание точек
    if (second % 2 > 0) {
      tm1637.point(POINT_ON);   } // включаем точки;
      else tm1637.point(POINT_OFF); // выключаем точки

    // отправляем массив на экран
    tm1637.display(TimeDisp);
    }
     
     
    Последнее редактирование: 3 окт 2017
  6. Oleksandr54

    Oleksandr54 Нерд

  7. DetSimen

    DetSimen Гик

    быстрее так
    Код (C++):
    if (second & 1)  // нечётные секунды
      tm1637.point(POINT_ON); // включаем точки;
      else tm1637.point(POINT_OFF); // выключаем точки
     
    ИгорьК и Securbond нравится это.
  8. DetSimen

    DetSimen Гик

    А еще быстрее так

    tm1637.point( (second & 1) ? POINT_ON : POINT_OFF);
     
    ИгорьК нравится это.
  9. ИгорьК

    ИгорьК Давно здесь

    Это, интересно, быстрее или запись короче? Все равно компилятор здесь будет злодействовать, как и в других случаях.
     
  10. DetSimen

    DetSimen Гик

    запись короче. Не дисассемблировал, по скорости/размеру нинаю как отличается. Надо скомпилить и так и так, да паматреть разность.
     
  11. DetSimen

    DetSimen Гик

    Но почему-то мне кажется, что код сгенерится один и тот же.
    я бы щас вапще так написал

    tm1637.point( second & 1);

    если POINT_OFF и POINT_ON это 0 и 1
     
    ИгорьК нравится это.