Помогите понять что не так с кодом

Iskandarov
Offline
Зарегистрирован: 03.07.2014

Собрал часы на семисегментных индикаторах и сдвиговых регистрах, подключил модуль часов реального времени, но почему- то цифры не выводятся, вот код который собрал из разичных примеров

#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 (SER, OUTPUT);
  pinMode (LATCH, OUTPUT);
  pinMode (CLK, OUTPUT);
  
  pinMode(RTC_POW_PIN, OUTPUT);
  pinMode(RTC_GND_PIN, 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 refresh_rate = 500;
  //Присваеваем значение для переменных
  
  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[2]);
    shiftOut(SER, CLK, MSBFIRST, num[m1]);
    shiftOut(SER, CLK, MSBFIRST, num[h2]);
    shiftOut(SER, CLK, MSBFIRST, num[2]);
  digitalWrite(LATCH,HIGH);
  delay(500); 
  }

 

ALEXHEX
Offline
Зарегистрирован: 12.12.2013

Сколько сдвиговых регистров использовал?
Теорию работы с ними разобрал?
Я только для одного освоил, для двух и более ещё не понимаю. Но в твоём коде увидел несостыковку именно там
Вот сссылка на подключение 2 регистров.

http://uscr.ru/kak-podklyuchit-sdvigoviy-registr-k-arduino/

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

Попробуйте для начала

1) просто, безо всяких часов, выводит цифры на индикатор
2) просто, без всякого индикатора, выводить время в сериал.

Поймите, где у Вас проблема, решите её, а потом уж объединяйте скетчи в один.

Iskandarov
Offline
Зарегистрирован: 03.07.2014

Отдельно цифры выводятся отлично, например с этого скетча

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

И часы в сериал выводятся

а вот вместе не хотят работать

 

Iskandarov
Offline
Зарегистрирован: 03.07.2014

Сдвиговых регистров использую шесть, статическая индикция

T.Rook
Offline
Зарегистрирован: 05.03.2016

А вот это что:

const int RTC_GND_PIN =A4;

?

Там точно GND?

Вижу pinMode(RTC_GND_PIN, OUTPUT); но не вижу установки значения.

  pinMode(RTC_POW_PIN, OUTPUT);
  pinMode(RTC_GND_PIN, OUTPUT);
   
  digitalWrite (RTC_POW_PIN, HIGH);
  digitalWrite (RTC_POW_PIN, LOW);

тут все так и должно быть?

Iskandarov
Offline
Зарегистрирован: 03.07.2014

Да, исправил, там должно быть так

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

 

Iskandarov
Offline
Зарегистрирован: 03.07.2014

Но всё равно не работает, потому что я модуль часов подключа даже к обычным пинам питания

Iskandarov
Offline
Зарегистрирован: 03.07.2014

Вообщем когда убираю этот блок 

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[2]);
    shiftOut(SER, CLK, MSBFIRST, num[1]);
    shiftOut(SER, CLK, MSBFIRST, num[2]);
    shiftOut(SER, CLK, MSBFIRST, num[3]);
    shiftOut(SER, CLK, MSBFIRST, num[2]);
    shiftOut(SER, CLK, MSBFIRST, num[1]);
  digitalWrite(LATCH,HIGH);

то всё нормально, всё выводится

но когда этот блог возвращаю, то опять ничего, даже цифры просто не выводятся

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

Iskandarov пишет:

Вообщем когда убираю этот блок 

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

Не знаю, что у Вас выводится, только Вы попробуйте вывести в сериал значения переменных h1, h2, m1, m2, s1, s2 после вот этих строк. Узнаете много интересного. Уверен. что Вы этого не делали и понятия не имеете какие у Вас получаются занчения в этих переменных.

Я же Вам писал - выводите всё в отладочную печать, не работайте вслепую и добивайтесь, чтобы всё было нормально на каждом шаге. Тогда и вся программа заработает.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Iskandarov пишет:

Вообщем когда убираю этот блок 

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

Подозреваю, что не надо скобки после now.hour и иже с ними.

 

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

DIYMan пишет:

Подозреваю, что не надо скобки после now.hour и иже с ними.

Напрасно подозреваете. Это методы. 

Прошу Вас не подсказывайте, что не так с этими выражениями. Я уже написал ТС, чтобы напечатал значения и посмотрел. Подскажете - не сделает и через день другой опять на те же грабли.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

ЕвгенийП пишет:

Напрасно подозреваете. Это методы. 

Прошу Вас не подсказывайте, что не так с этими выражениями. Я уже написал ТС, чтобы напечатал значения и посмотрел. Подскажете - не сделает и через день другой опять на те же грабли.

Ок, понял. Я так - навскидку :) Конечно, не знаючи, как там устроен DatеTime, моё предположение - пальцем в ж., что называется :)

Iskandarov
Offline
Зарегистрирован: 03.07.2014

ЕвгенийП пишет:

Iskandarov пишет:

Вообщем когда убираю этот блок 

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

Не знаю, что у Вас выводится, только Вы попробуйте вывести в сериал значения переменных h1, h2, m1, m2, s1, s2 после вот этих строк. Узнаете много интересного. Уверен. что Вы этого не делали и понятия не имеете какие у Вас получаются занчения в этих переменных.

Я же Вам писал - выводите всё в отладочную печать, не работайте вслепую и добивайтесь, чтобы всё было нормально на каждом шаге. Тогда и вся программа заработает.

в сериал ничего не выводится

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

[quote=Iskandarov]

в сериал ничего не выводится

[/quote]

И не будет, пока Вы его не инициализируете. В setup-то неплохо бы написать что-то вроде

Serial.begin(<скорость>);

Iskandarov
Offline
Зарегистрирован: 03.07.2014


ЕвгенийП]</p> <p>[quote=Iskandarov пишет:

в сериал ничего не выводится

[/quote]

И не будет, пока Вы его не инициализируете. В setup-то неплохо бы написать что-то вроде

Serial.begin(<скорость>);

в setup есть инициализация 



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

 

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

Ну, тогда смотрите от того ли порта монитор, не задействованы ли в скетче ноги Rx/Tx для других нужд и всё остальное, я не знаю то там у Вас ещё. Добейтесь, чтобы вериал нормально работал. Если у Вас вывод в Serial не работает, то как Вы собираетесь всё остальное работать-то заставить.

Как только заработает и Вы увидите, наконец, чему у Вас равны эти переменные, многое Вам станет понятнее.

Iskandarov
Offline
Зарегистрирован: 03.07.2014

Перебросил питание часов с А3 А4 на +5 и GND и "о чудо" монитор порта заработал

Iskandarov
Offline
Зарегистрирован: 03.07.2014

И да, там все значения 10

Iskandarov
Offline
Зарегистрирован: 03.07.2014

Все, понял 

Iskandarov
Offline
Зарегистрирован: 03.07.2014

DEC в строках было лишнее

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

Ну, вот и отлично. Я специально Вам не подсказывал. На будущее - при любых непонятках, печатайте всё подряд, смотрите и анализируйте - только так Вы научитесь разбираться и дожимать программы до работающего состояния.

Iskandarov
Offline
Зарегистрирован: 03.07.2014

Спасибо большое