Estoy trabajando en un reloj de palabras y estoy usando 3 regsiters de cambio (CD4094BE) y 3 matrices de transistores Darlington (ULN2003A) para controlar si hay 21 palabras diferentes activadas o desactivadas. Las palabras constan de LED, cada LED tiene una resistencia de 220 ohmios en línea con su cable positivo, y los LED en una palabra comparten una base común. Hago esto para que las palabras con diferentes cantidades de LED no tengan diferentes niveles de brillo. Ejecuto el terreno común para cada palabra en una matriz de transistores, y luego uso los registros de desplazamiento para habilitar un camino hacia el suelo.
Tengo un problema con el registro de segundo turno en mi cadena de registros de turnos. Si cambio un byte que consta de todos los 0, B00000000, entonces todas las palabras permanecen completamente desactivadas. Con la excepción del valor B00000001 y B00000000, cualquier byte que muevo en él parece iluminar la palabra deseada, e ilumina débilmente el resto de las palabras conectadas a la matriz de transistores respectiva / registro de desplazamiento.
He usado un voltímetro para medir el voltaje entre un pin de salida que se supone que está apagado en el registro de desplazamiento de problemas y en los otros dos que parecen estar funcionando bien. En el registro de cambio de problemas, obtengo en promedio una lectura de 0.5 voltios para un pin de apagado, mientras que los otros dos leen aproximadamente 0.01 voltios.
He intentado cambiar la matriz de transistores y el registro de cambios en caso de que los componentes estuvieran dañados, pero no he tenido suerte. Incluso los cambié por los de trabajo y los puse de nuevo en su posición original. Los componentes no parecen estar dañados.
Las siguientes son las hojas de datos a las que me he referido:
Estoy usando un Arduino Uno y una fuente de alimentación de 5 voltios para alimentar / ejecutar el proyecto.
Aquí hay algunas imágenes reales del proyecto, y un circuito aproximado que inventé para demostrar lo que podría no estar claro en las imágenes.
Aquíestáelcódigoqueestoyusando.PuedeverqueestoyusandolasvariablesDisplay1-3paradefinirlosestadosdelosregistrosdedesplazamiento.Actualmentelosestoyconfigurandomanualmente,enlugardedejarquelalógicaquetengoestablezcalosvalores.Noincluyelosarchivosparaalgunasdelasfuncionesquenosonrelevantesparaloqueestásucediendo(obtencióndeinformacióndelmóduloRTCqueestoyusando).Noestoysegurodequémáspuedoofrecer.¡Sóloházmelosaber!¡Ygracias!
/*WORDCLOCKINSPIREDBYhttp://imgur.com/a/iMXmj*/#include<Wire.h>#include<Adafruit_NeoPixel.h>/*DEFINITIONS*/#definebday_strip_size14#definebday_strip_pin12//thefollowingarethepindefinitonsforthegroundoftherespectivewords#defineHALFDisplay1=Display1|(1<<0)#defineH_TIUDisplay1=Display1|(1<<1)#defineTUTTUGUDisplay1=Display1|(1<<2)#defineOGDisplay1=Display1|(1<<3)#defineH_FIMMDisplay1=Display1|(1<<5)#defineFIMMTANDisplay1=Display1|(1<<4)#defineMINUTURDisplay1=Display1|(1<<6)#defineINDisplay2=Display2|(1<<0)#defineYFIRDisplay2=Display2|(1<<1)#defineTHRJUDisplay2=Display2|(1<<2)#defineELLEFUDisplay2=Display2|(1<<3)#defineATTADisplay2=Display2|(1<<4)#defineEITTDisplay2=Display2|(1<<5)#defineNIUDisplay2=Display2|(1<<6)#defineSJODisplay3=Display3|(1<<0)#defineSEXDisplay3=Display3|(1<<1)#defineTOLFDisplay3=Display3|(1<<2)#defineTVODisplay3=Display3|(1<<3)#defineL_TIUDisplay3=Display3|(1<<4)#defineL_FIMMDisplay3=Display3|(1<<5)#defineFJOGURDisplay3=Display3|(1<<6)//regsiterpins#defineCD4094_CLOCK8#defineCD4094_DATA9#defineCD4094_STROBE10#defineCD4094_OUTPUT11/*VARIABLEDECLERATIONS*///thesearethetimevariables,thertcfunctionsareinaseperatefile.donethiswaytobeabletoeasilypluginanothersourceoftimeintseconds;intminutes;inthours;intday;intdate;//0-31intmonth;intyear;//0-99intcentury;//byteDisplay1=B00011000;byteDisplay2=B01000000;byteDisplay3=B00000001;Adafruit_NeoPixelbday_strip=Adafruit_NeoPixel(bday_strip_size,bday_strip_pin,NEO_GRB+NEO_KHZ800);voidsetup(){pinMode(CD4094_CLOCK,OUTPUT);pinMode(CD4094_STROBE,OUTPUT);pinMode(CD4094_DATA,OUTPUT);pinMode(CD4094_OUTPUT,OUTPUT);digitalWrite(CD4094_OUTPUT,HIGH);bday_strip.begin();bday_strip.setBrightness(100);//set_rtc_date(7,13,9,14);//set_rtc_time(0,36,15);Serial.begin(9600);while(!Serial);Serial.println("application start");
Wire.begin();// start IC2 interface for communicating with Chronodot RTC module
clear_ESOC_bit();
}
void loop() {
get_date();
get_time();
print_rtc_datetime();
//clear_leds();
//MINUTUR;
//IN;
//YFIR;
//THRJU;
//NIU;
//FJOGUR;
//set_time_pins();
write_leds();
//rainbowCycle(20);
Serial.println(Display1, BIN);
Serial.println(Display2, BIN);
Serial.println(Display3, BIN);
delay(1000);
}
void set_time_pins() {
if(minutes > 4 && minutes < 10) {
H_FIMM;
MINUTUR;
}
if(minutes > 9 && minutes < 15) {
H_TIU;
MINUTUR;
}
if(minutes > 14 && minutes < 20) {
FIMMTAN;
MINUTUR;
}
if(minutes > 19 && minutes < 25) {
TUTTUGU;
MINUTUR;
}
if(minutes > 24 && minutes < 30) {
TUTTUGU;
OG;
H_FIMM;
MINUTUR;
}
if(minutes > 29 && minutes < 35) {
HALF;
}
if(minutes > 34 && minutes < 40) {
TUTTUGU;
OG;
H_FIMM;
MINUTUR;
}
if(minutes > 39 && minutes < 45) {
TUTTUGU;
MINUTUR;
}
if(minutes > 44 && minutes < 50) {
FIMMTAN;
MINUTUR;
}
if(minutes > 49 && minutes < 55) {
H_TIU;
MINUTUR;
}
if(minutes > 54) {
H_FIMM;
MINUTUR;
}
int working_hour = hours;
if (minutes > 29) {
working_hour = hour_cap(working_hour, 1);
}
switch(working_hour) {
case 1:
EITT;
break;
case 2:
TVO;
break;
case 3:
THRJU;
break;
case 4:
FJOGUR;
break;
case 5:
L_FIMM;
break;
case 6:
SEX;
break;
case 7:
SJO;
break;
case 8:
ATTA;
break;
case 9:
NIU;
break;
case 10:
L_TIU;
break;
case 11:
ELLEFU;
break;
case 12:
TOLF;
break;
}
if ((minutes < 5) || (minutes > 29 && minutes < 35)) {
//
} else {
if(minutes > 30) {
YFIR;
} else {
IN;
}
}
}
void clear_leds() {
Display1 = 0;
Display2 = 0;
Display3 = 0;
}
void write_leds() {
//digitalWrite(CD4094_OUTPUT, LOW);
digitalWrite(CD4094_STROBE, HIGH);
shiftOut(CD4094_DATA, CD4094_CLOCK, MSBFIRST, Display3);
shiftOut(CD4094_DATA, CD4094_CLOCK, MSBFIRST, Display2);
shiftOut(CD4094_DATA, CD4094_CLOCK, MSBFIRST, Display1);
//digitalWrite(CD4094_OUTPUT, HIGH);
digitalWrite(CD4094_STROBE, LOW);
}
int hour_cap(int working_hour, int incriment) {
working_hour += incriment;
if(working_hour > 12) {
working_hour = 1;
}
if(working_hour < 1) {
working_hour = 12;
}
return working_hour;
}
void get_date() {
get_rtc_date();
}
void get_time() {
get_rtc_time();
}