Нужна помощь в создании часов

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

  1. Rinat

    Rinat Нуб

    Решил сделать шестиразрядные часы на сдвиговых регистрах и с модулем часов реального времени, вроде бы просто выводить цифры на индикаторы получается, а подружить с модулем часов нет.
    Вот мой скетч
    Код (C++):
    #include <Wire.h>
    #include "RTClib.h"
    const int RTC_POW_PIN =A3;
    const int RTC_GND_PIN =A3;

    int refresh_rate = 500;
    RTC_DS1307 RTC;
    String hour, minute, second, time;

    const byte SER=8;
    const byte LATCH=9;
    const byte CLK=10;
    byte num[10] = {B11000000, B11111001, B10100100, B10110000, B10011001, B10010010, B10000010, B11111000, B10000000, B10010000,}; // 0, 1
    void setup() {
      Serial.begin (9600);
      pinMode(RTC_POW_PIN, OUTPUT);
      pinMode(RTC_GND_PIN, OUTPUT);
     
      pinMode (SER, OUTPUT);
      pinMode (LATCH, OUTPUT);
      pinMode (CLK, OUTPUT);
     
      digitalWrite (RTC_POW_PIN, HIGH);
      digitalWrite (RTC_POW_PIN, LOW);
     
      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 datetime = RTC.now();
    hour = String(datetime.hour(), DEC);
    minute = String(datetime.minute(), DEC);
    second = String(datetime.second(), DEC);

      //Присваеваем значение для переменных
      int h1 = hour / 10;
      int h2 = hour % 10;
      int m1 = minute / 10;
      int m2 = minute % 10;
      int s1 = second / 10;
      int s2 = second % 10;


      digitalWrite(LATCH,LOW);
        shiftOut(SER, CLK, MSBFIRST, num[s2]);
        shiftOut(SER, CLK, MSBFIRST, num[s1]);
        shiftOut(SER, CLK, MSBFIRST, num[m2]);
        shiftOut(SER, CLK, MSBFIRST, num[m1]);
        shiftOut(SER, CLK, MSBFIRST, num[h2]);
        shiftOut(SER, CLK, MSBFIRST, num[h1]);
      digitalWrite(LATCH,HIGH);
      delay(500);
      }
     
  2. Rinat

    Rinat Нуб

    Выдаёт вот такие ошибки
    Код (C++):
    sketch3.ino: In function 'void loop()':
    sketch3:41: error: no match for 'operator/' in 'hour / 10'
    sketch3:42: error: no match for 'operator%' in 'hour % 10'
    sketch3:43: error: no match for 'operator/' in 'minute / 10'
    sketch3:44: error: no match for 'operator%' in 'minute % 10'
    sketch3:45: error: no match for 'operator/' in 'second / 10'
    sketch3:46: error: no match for 'operator%' in 'second % 10'
     
     
  3. Vad33

    Vad33 Капитан-оригинал

    Ошибка, говорит о том, что к строке применяются матем. действия
     
    Последнее редактирование: 13 апр 2016
  4. Rinat

    Rinat Нуб

    А как это можно исправить?
     
    Последнее редактирование: 13 апр 2016
  5. Rinat

    Rinat Нуб

    Немного переделал код
    Код (C++):
    #include <Wire.h>
    #include "RTClib.h"
    const int RTC_POW_PIN =A3;
    const int RTC_GND_PIN =A3;

    int refresh_rate = 500;
    RTC_DS1307 RTC;
    String hour, minute, second, time;

    const byte SER=8;
    const byte LATCH=9;
    const byte CLK=10;
    byte num[10] = {B11000000, B11111001, B10100100, B10110000, B10011001, B10010010, B10000010, B11111000, B10000000, B10010000,}; // 0, 1
    void setup() {
      Serial.begin (9600);
      pinMode(RTC_POW_PIN, OUTPUT);
      pinMode(RTC_GND_PIN, OUTPUT);
     
      pinMode (SER, OUTPUT);
      pinMode (LATCH, OUTPUT);
      pinMode (CLK, OUTPUT);
     
      digitalWrite (RTC_POW_PIN, HIGH);
      digitalWrite (RTC_POW_PIN, LOW);
     
      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 datetime = RTC.now();


      //Присваеваем значение для переменных
      int h1 = (now.hour()/10, DEC);
      int h2 = (now.hour()%10, DEC);
      int m1 = (now.minute()/10, DEC);
      int m2 = (now.minute()%10, DEC);
      int s1 = (now.second()/10, DEC);
      int s2 = (now.second()%10, DEC);


      digitalWrite(LATCH,LOW);
        shiftOut(SER, CLK, MSBFIRST, num[s2]);
        shiftOut(SER, CLK, MSBFIRST, num[s1]);
        shiftOut(SER, CLK, MSBFIRST, num[m2]);
        shiftOut(SER, CLK, MSBFIRST, num[m1]);
        shiftOut(SER, CLK, MSBFIRST, num[h2]);
        shiftOut(SER, CLK, MSBFIRST, num[h1]);
      digitalWrite(LATCH,HIGH);
      delay(500);
      }
     
  6. Rinat

    Rinat Нуб

    теперь одна ошибка, вот
    Код (C++):
    sketch3.ino: In function 'void loop()':
    sketch3:38: error: 'now' was not declared in this scope
     
     
  7. Vad33

    Vad33 Капитан-оригинал

    Теперь говорит , что now не определена. Видима там что то другое должно стоять? :)
     
  8. Rinat

    Rinat Нуб

    Да, нашел там datetime должно быть вместо now
     
  9. Rinat

    Rinat Нуб

    Всё, теперь компилятор не ругается!
     
  10. Rinat

    Rinat Нуб

    Загрузил в arduino, но почему-то цифры на индикаторах не горят
     
  11. Vad33

    Vad33 Капитан-оригинал

    Попробуйте что ни будь принудительно вывести не из часов.
     
  12. Rinat

    Rinat Нуб

    Принудительно тоже не выводиться
     
  13. Rinat

    Rinat Нуб

    Хотя вот из этого кода все цифры выводятся отлично
    Код (C++):
    const byte SER=8;
    const byte LATCH=9;
    const byte CLK=10;

    byte num[10] = {B11000000, B11111001, B10100100, B10110000, B10011001, B10010010, B10000010, B11111000, B10000000, B10010000,}; // 0, 1
    void setup()
    {
      pinMode (SER, OUTPUT);
      pinMode (LATCH, OUTPUT);
      pinMode (CLK, OUTPUT);
     
    }

    void loop() {
       digitalWrite (LATCH, LOW);
      shiftOut (SER, CLK, MSBFIRST, num[1]);
      shiftOut (SER, CLK, MSBFIRST, num[2]);
      shiftOut (SER, CLK, MSBFIRST, num[3]);
      shiftOut (SER, CLK, MSBFIRST, num[4]);
      digitalWrite (LATCH, HIGH);
    delay(2000);
      digitalWrite (LATCH, LOW);
      shiftOut (SER, CLK, MSBFIRST, num[4]);
      shiftOut (SER, CLK, MSBFIRST, num[3]);
      shiftOut (SER, CLK, MSBFIRST, num[2]);
      shiftOut (SER, CLK, MSBFIRST, num[1]);
      digitalWrite (LATCH, HIGH);
      delay(2000);
      digitalWrite (LATCH, LOW);
      shiftOut (SER, CLK, MSBFIRST, num[5]);
      shiftOut (SER, CLK, MSBFIRST, num[5]);
      shiftOut (SER, CLK, MSBFIRST, num[5]);
      shiftOut (SER, CLK, MSBFIRST, num[5]);
      digitalWrite (LATCH, HIGH);
      delay(2000);
      digitalWrite (LATCH, LOW);
      shiftOut (SER, CLK, MSBFIRST, num[0]);
      shiftOut (SER, CLK, MSBFIRST, num[0]);
      shiftOut (SER, CLK, MSBFIRST, num[0]);
      shiftOut (SER, CLK, MSBFIRST, num[0]);
      digitalWrite (LATCH, HIGH);
      delay(2000);
      }
     
  14. Vad33

    Vad33 Капитан-оригинал

    Какой текущий скетч?
     
  15. Rinat

    Rinat Нуб

    Код (C++):
    #include <Wire.h>
    #include "RTClib.h"
    const int RTC_POW_PIN =A3;
    const int RTC_GND_PIN =A4;

    int refresh_rate = 500;
    RTC_DS1307 RTC;


    const byte SER=8;
    const byte LATCH=9;
    const byte CLK=10;
    byte num[10] = {B11000000, B11111001, B10100100, B10110000, B10011001, B10010010, B10000010, B11111000, B10000000, B10010000,}; // 0, 1
    String hour, minute, second;
    void setup() {
      Serial.begin (9600);
      pinMode(RTC_POW_PIN, OUTPUT);
      pinMode(RTC_GND_PIN, OUTPUT);
     
      pinMode (SER, OUTPUT);
      pinMode (LATCH, OUTPUT);
      pinMode (CLK, OUTPUT);

      digitalWrite (RTC_POW_PIN, HIGH);
      digitalWrite (RTC_POW_PIN, LOW);

      Wire.begin();
      RTC.begin();
      //if (! RTC.isrunning()) {
        //Serial.println("RTC is NOT running!");
        //RTC.adjust(DateTime(__DATE__, __TIME__));}
    }
    void loop(){
    DateTime now = RTC.now();

      //Присваеваем значение для переменных
      int h1 = (now.hour()/10,   DEC);
      int h2 = (now.hour()%10,   DEC);
      int m1 = (now.minute()/10, DEC);
      int m2 = (now.minute()%10, DEC);
      int s1 = (now.second()/10, DEC);
      int s2 = (now.second()%10, DEC);



      digitalWrite(LATCH,LOW);
        shiftOut(SER, CLK, MSBFIRST, num[s2]);
        shiftOut(SER, CLK, MSBFIRST, num[s1]);
        shiftOut(SER, CLK, MSBFIRST, num[m2]);
        shiftOut(SER, CLK, MSBFIRST, num[m1]);
        shiftOut(SER, CLK, MSBFIRST, num[h2]);
        shiftOut(SER, CLK, MSBFIRST, num[h1]);
      digitalWrite(LATCH,HIGH);
      delay(500);
      }
     
  16. Vad33

    Vad33 Капитан-оригинал

    Там в присваивании значений мусор остался. Попробуте почистить.
     
  17. Rinat

    Rinat Нуб

    Что именно, DEC?
     
  18. Vad33

    Vad33 Капитан-оригинал

    У вас же Serial подключен, добавьте строчки типа

    Код (C++):
    Serial.print("h1=");Serial.println(h1);
    Serial.print("h2=");Serial.println(h2);
    Serial.print("m1=");Serial.println(m1);
    Serial.print("m2=");Serial.println(m2);
    Serial.print("s1=");Serial.println(s1);
    Serial.print("s2=");Serial.println(s2);
    И смотрите что выводит.
     
  19. Rinat

    Rinat Нуб

    Добавил, в сериал ничего не выводится
     
  20. Vad33

    Vad33 Капитан-оригинал

    Ничего не выводится где? В мониторе последовательного порта? Не может быть! :)
    Попробуйте еще раз,
    Меню: Инструменты -> Монитор последовательного порта