Помогите понять что не так с кодом
- Войдите на сайт для отправки комментариев
Ср, 13/04/2016 - 19:47
Собрал часы на семисегментных индикаторах и сдвиговых регистрах, подключил модуль часов реального времени, но почему- то цифры не выводятся, вот код который собрал из разичных примеров
#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);
}
Сколько сдвиговых регистров использовал?
Теорию работы с ними разобрал?
Я только для одного освоил, для двух и более ещё не понимаю. Но в твоём коде увидел несостыковку именно там
Вот сссылка на подключение 2 регистров.
http://uscr.ru/kak-podklyuchit-sdvigoviy-registr-k-arduino/
Попробуйте для начала
1) просто, безо всяких часов, выводит цифры на индикатор
2) просто, без всякого индикатора, выводить время в сериал.
Поймите, где у Вас проблема, решите её, а потом уж объединяйте скетчи в один.
Отдельно цифры выводятся отлично, например с этого скетча
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); }И часы в сериал выводятся
а вот вместе не хотят работать
Сдвиговых регистров использую шесть, статическая индикция
А вот это что:
?
Там точно GND?
Вижу
pinMode(RTC_GND_PIN, OUTPUT);но не вижу установки значения.тут все так и должно быть?
Да, исправил, там должно быть так
Но всё равно не работает, потому что я модуль часов подключа даже к обычным пинам питания
Вообщем когда убираю этот блок
И просто пытаюсь вывести цифры
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);то всё нормально, всё выводится
но когда этот блог возвращаю, то опять ничего, даже цифры просто не выводятся
Вообщем когда убираю этот блок
Не знаю, что у Вас выводится, только Вы попробуйте вывести в сериал значения переменных h1, h2, m1, m2, s1, s2 после вот этих строк. Узнаете много интересного. Уверен. что Вы этого не делали и понятия не имеете какие у Вас получаются занчения в этих переменных.
Я же Вам писал - выводите всё в отладочную печать, не работайте вслепую и добивайтесь, чтобы всё было нормально на каждом шаге. Тогда и вся программа заработает.
Вообщем когда убираю этот блок
Подозреваю, что не надо скобки после now.hour и иже с ними.
Подозреваю, что не надо скобки после now.hour и иже с ними.
Напрасно подозреваете. Это методы.
Прошу Вас не подсказывайте, что не так с этими выражениями. Я уже написал ТС, чтобы напечатал значения и посмотрел. Подскажете - не сделает и через день другой опять на те же грабли.
Напрасно подозреваете. Это методы.
Прошу Вас не подсказывайте, что не так с этими выражениями. Я уже написал ТС, чтобы напечатал значения и посмотрел. Подскажете - не сделает и через день другой опять на те же грабли.
Ок, понял. Я так - навскидку :) Конечно, не знаючи, как там устроен DatеTime, моё предположение - пальцем в ж., что называется :)
Вообщем когда убираю этот блок
Не знаю, что у Вас выводится, только Вы попробуйте вывести в сериал значения переменных h1, h2, m1, m2, s1, s2 после вот этих строк. Узнаете много интересного. Уверен. что Вы этого не делали и понятия не имеете какие у Вас получаются занчения в этих переменных.
Я же Вам писал - выводите всё в отладочную печать, не работайте вслепую и добивайтесь, чтобы всё было нормально на каждом шаге. Тогда и вся программа заработает.
в сериал ничего не выводится
[quote=Iskandarov]
в сериал ничего не выводится
[/quote]
И не будет, пока Вы его не инициализируете. В setup-то неплохо бы написать что-то вроде
Serial.begin(<скорость>);
в сериал ничего не выводится
[/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);Ну, тогда смотрите от того ли порта монитор, не задействованы ли в скетче ноги Rx/Tx для других нужд и всё остальное, я не знаю то там у Вас ещё. Добейтесь, чтобы вериал нормально работал. Если у Вас вывод в Serial не работает, то как Вы собираетесь всё остальное работать-то заставить.
Как только заработает и Вы увидите, наконец, чему у Вас равны эти переменные, многое Вам станет понятнее.
Перебросил питание часов с А3 А4 на +5 и GND и "о чудо" монитор порта заработал
И да, там все значения 10
Все, понял
DEC в строках было лишнее
Ну, вот и отлично. Я специально Вам не подсказывал. На будущее - при любых непонятках, печатайте всё подряд, смотрите и анализируйте - только так Вы научитесь разбираться и дожимать программы до работающего состояния.
Спасибо большое