Gentili utenti,
ho incontrato difficoltà nella realizzazione di un piccolo progetto e credo che il problema sia del mio codice che ho scritto sulla falsariga di un esempio trovato online (data la mia poca esperienza).
Il progetto consiste nell'accendere dei led numerati da 1 a 9 attraverso uno shift register (TI 74HC595). In teoria mandando alla scheda un numero da 1 a 9 inserito dal monitor seriale, l'arduino dovrebbe accendere il led corrispondente e scrivendo A sul monitor seriale si dovrebbero spegnere tutti i led. Mentre per lo spegnimento non ho problemi, quando inserisco un numero si accende sempre lo stesso led.
Ho provato a fare alcuni cambiamenti e una delle differenze che ho notato è che modificando nella funzione shiftOut alla penultima riga MSBFIRST con LSBFIRST il led che si accende per ogni numero che digito cambia.
Credo che il problema sia nella parte in cui definisco la funzione registerWrite, in particolare nella creazione del byte che poi dovrebbe essere inviato allo shift register.
Essendo il mio primo topic, spero di aver rispettato tutte le norme del regolamento e spero di essere stato sufficientemente chiaro ed esauriente.
int dataPin = 10;
int latchPin = 11;
int clockPin = 12;
void setup() {
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
Serial.begin(9600);
Serial.println("Inizio");
}
void loop() {
if (Serial.available() > 0) {
if (Serial.read() == 65) {
registerWrite(1, LOW);
registerWrite(2, LOW);
registerWrite(3, LOW);
registerWrite(4, LOW);
registerWrite(5, LOW);
registerWrite(6, LOW);
registerWrite(7, LOW);
registerWrite(8, LOW);
registerWrite(9, LOW);
delay(2000);
}
else {
int BIT = Serial.read() -48;
registerWrite(BIT, HIGH);
}
}
delay(1000);
}
void registerWrite(int WhichPin, int WhichState) {
byte bitsToSend;
digitalWrite(latchPin, LOW);
bitWrite(bitsToSend, WhichPin, WhichState);
shiftOut(dataPin, clockPin, MSBFIRST, bitsToSend);
digitalWrite(latchPin, HIGH);
}