Добрый день! Пытаюсь собрать часы на ардуино нано, и возникла проблема- при подключении инфракрасного приемника к определенному входу некоторые другие выходы начинают переодически выдавать какой-то шум. Была подобная проблема при подключении модуля часов к A4 A5 с выходами D0 D1 и я исправил ее просто тем что перестал использовать эти выходы. Сейчас же, похоже что глючат D2 или D3, но я не уверен- из-за того что все это на плате тяжело проверить перебором. Можете подсказать, как это исправить, и есть ли какая-то закономерность- т.е. какие выходы могут глючить при подключении определенных модулей. Спасибо!
P.S. Без этого модуля все работает исправно- глюки только после подключения инфракрасного датчика. Ну и сам датчик работает нормально. Просто раз в несколько секунд цифры на часах как-то странно меняются.
Ну код как код- все работало нормально, я добавил к нему строки из примера irecv_demo и начались глюки.
Какой-то участок кода выполняется дольше, чем время обновления цифр. Или ваша программа одновременно использует тот же таймер что и библиотека IR Remote. Поэтому видна засветка цифр.
Код моей программы длинный и непонятный- я его обрезал и добавил пару коментариев. Делаю я часы на газоразрядных индикаторах. https://geektimes.ru/post/257806/ Код (C++): #include <Wire.h> #include "RTClib.h" #include <IRremote.h> int key[]= {12,8,7,6,5,4}; //транзисторные ключи int out[]={3,15,16,2}; //входы дешифратора, 15=А2, 16=А3 int RECV_PIN = 17; //часы подключены к А4 А5 RTC_DS3231 rtc; IRrecv irrecv(RECV_PIN); decode_results results; #define FREQ 1 #define DEL1 200 #define DEL2 500 int T[]={500,500,100,100,100}; int N=5; unsigned long startTime=0; int flag=0; ///////////////////////////////////////////////////// void setup() { #ifndef ESP8266 while (!Serial); #endif Serial.begin(9600); irrecv.enableIRIn(); for (int i=0; i<4; i++) { pinMode(out[i],OUTPUT); } for (int i=0; i<6; i++) { pinMode(key[i],OUTPUT); } if (! rtc.begin()) { Serial.println("Couldn't find RTC"); while (1); } //rtc.adjust(DateTime(2016, 5, 20, 14, 02, 00)); if (rtc.lostPower()) { Serial.println("RTC lost power, lets set the time!"); rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); rtc.adjust(DateTime(2016, 5, 16, 22, 30, 0)); } startTime = millis(); } ////----------------------------------------------------------------------- void loop () { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.resume(); // Receive the next value } unsigned long currentTime = millis(); int a[5]; //цифры на часах for (int i=0; i<N; i++){ // if (currentTime>=(startTime+500)){ startTime = currentTime; flag=1; } } if (flag) { DateTime now = rtc.now(); int h=now.hour(); int m=now.minute(); int s=now.second(); a[0] = h/10; a[1] = h%10; a[2] = m/10; a[3] = m%10; a[4] = s/10; a[5] = s%10; } show(a); flag=0; } ////----------------------------------------------------------------------- void show(int c[])//динамическая индикация- каждую цифру по 1мс { int x= 6; for (int i=0; i<x; i++){ setNumber(c[i]); digitalWrite(key[i],HIGH); delay(FREQ); digitalWrite(key[i],LOW); } } void setNumber(int num) //сигнал дешифратору- из десятичного в бинарный { for (int i=0; i<4; i++){ int h=num%2; num/=2; if(h){ digitalWrite (out[i],HIGH); } else{ digitalWrite (out[i],LOW); } } } часы в работе https://www.dropbox.com/s/a1z3i0pzu3r0sqj/DSC_0013.JPG?dl=0 схема https://www.dropbox.com/s/a1z3i0pzu3r0sqj/DSC_0013.JPG?dl=0
А может есть какие-то другие способы подключения ДУ или аналоги ДУ? А то хотелось бы обойтись без кнопок.
Guri, поправьте ссылку на схему. Можно настроить свободный таймер на ~300Гц (6 символов * 50Гц) и show() вызывать в прерывании.
Я хотел сказать плата, а не схема. А схема такая: Где а1..а6== key[]={12,8,7,6,5,4};//транзисторные ключи А0..А4==int out[]={3,15,16,2}; Проблема с динамической индикацией в том, что если частота меньше 500 герц (2мс на каждую цифру), то видно как прыгают цифры. А как это можно сделать?