Strano problema LED

Salve a tutti fra pochi giorni dovrò sostenere gli orali di maturità e ovviamente presentare il progetto.

Se guardati i miei vecchi post potete vedere di cosa si tratta..

Ho un altro problema, ho un classico semaforo con led, ogni led ha una R di 330ohm tutte saldate..
Testando tutti i led con un Blink è tutto ok lampeggiano regolarmente.. Ma appena scrivo il programma del semaforo questi due led (ARANCIONI) sballano.. Non capisco propio il motivo?
Pensate ci sia qualche altro sensore che faccia conflitto? Addirittura devo togliere dal setup il pinMode per non farli rimanere accesi.. Non capisco..

Connessi insieme al semaforo ci sono:

1 Sensore di Temp
1 Sensore Ultrasuoni
1 Potenziometro
1 Moltiplicatore di I/O Microchip MCP23017 (I2C protocol)
1 lcd 16x2 classico

(ARDUINO UNO)

Vi posto alcune foto.. e il codice (ho provato anche con semafori e tutorial in rete, ma lo stesso.. i led gialli rimangono accesi, col blink funziona tutto ok ogni led singolarmente!)

Se non fai vedere lo sketch e lo schema come facciamo ad aiutarti?

Scusami pensavo di averlo messo, il codice non ti è nuovo perchè dovresti averlo visto nel precedente Post
Eccolo:

#define led1 9
  #define led2 2
  #define led3 3
  //Secondo Semaforo
  #define leda 4
  #define ledb 5
  #define ledc 6
  
  #include <Wire.h> // Includo le librerie Wire e TWI2
   #include <LiquidTWI2.h>
    LiquidTWI2 lcd(0); //Iniziallizzo la connessione I2C all'indirizzo di default "o"
      const int triggerPort = 7;
        const int echoPort = 8;
          
    void setup()
    {
      Serial.begin(9600);
       Serial.print( "Sensore Ultrasuoni: ");
   pinMode(triggerPort,OUTPUT);
    pinMode(echoPort,INPUT);
     pinMode(led1,OUTPUT);
       pinMode(led2,OUTPUT);
        pinMode(led3,OUTPUT);
         pinMode(leda,OUTPUT);
          pinMode(ledb,OUTPUT);
           pinMode(ledc,OUTPUT); 
    lcd.setMCPType(LTI_TYPE_MCP23017); //Imposto il tipo di integrato (MICROCHIP)
     lcd.begin(16, 2);
      lcd.print("Semaforo");
        lcd.setCursor(0, 1);
          delay(2000);
            lcd.print("Intelligente");
              delay(2000);
                lcd.setCursor(13,1);
                  lcd.print("1.0");
                   delay(2000); 
                    lcd.clear();
                      lcd.setCursor(0,0);
                        lcd.print("Creato da:");
                          delay(2000);
                            lcd.setCursor(4,1);
                              lcd.print("Luca Costa");
                                delay(4000);
                                  lcd.clear();
                                    lcd.setCursor(0,0);
                                      lcd.print("Visita:Platone");
                                        delay(2000);
                                         lcd.setCursor(1,1);
                                          lcd.print("Ngineering.it");
                                           delay(4000);
                                            lcd.clear();
                                              delay(100);
                                              }

void loop() {
  digitalWrite( triggerPort, LOW );
//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort, HIGH );
delayMicroseconds( 10 );
digitalWrite( triggerPort, LOW );
long duration = pulseIn( echoPort, HIGH );
long r = 0.034 * duration / 2;
Serial.print( "durata: " );
Serial.print( duration );
Serial.print( " , " );
Serial.print( "distanza: " );
//dopo 38ms è fuori dalla portata del sensore
if( duration > 38000 )  Serial.println( "fuori portata");
else { Serial.print( r ); Serial.println( "cm" );}

digitalWrite(led3,HIGH); 
digitalWrite(led2,LOW);
digitalWrite(led1,LOW); 

digitalWrite(ledc,LOW); 
digitalWrite(ledb,LOW); 
digitalWrite(leda,HIGH); 
delay(5000);

digitalWrite(led2,HIGH); 
delay(1000);

digitalWrite(led3,LOW); 
digitalWrite(led2,LOW); 
digitalWrite(led1,HIGH); 
digitalWrite(ledc,HIGH); 
digitalWrite(ledb,LOW); 
digitalWrite(leda,LOW); 

delay(10000);

digitalWrite(ledb,HIGH); 
delay(1000);

}

Questo è lo schema di montaggio del LCD

Sensore Ultrasuoni

Sensore di temperatura

Questo è il codice generale ancora non completo ma caricando il programma del solo semaforo il problema è lo stesso

Non mi sembra che ci siano errori nello sketch.
Controlla bene il cablaggio dei fili.
Se i LED gialli rimangono sempre accesi, è possibile che le relative uscite siano danneggiate.
In questo caso dovresti sostituire il processore ATmega328.

è strano.. può essere che il moltiplicatore di porte faccia conflitto?
Usando il Blink in ogni singolo led funziona tutto perfettamente.. il problema è quando automatizzo il semaforo..
Devo togliere addirittura il pinMode nel setup (dei pin dei led arancioni) per non farli accendere. Funzione solo Verde e Rosso.

In più dopo 30 minuti (più o meno) di funzionamento perfetto il diplay incomincia a stampare caratteri sballati stile cinese.. va proprio in tilt. (Solo per curiosità perchè tanto il progetto lo vedrà la commissione si e no per 4 minuti)

Altra curiosità Perchè quando sostituisco il programma nel display rimangono le scritte del programma precedente? (Salvo comando clear) Il programma non dovrebbe essere scritta nella "ROM"? Questo moltiplicatore di porte ha una sorta di memoria? Non capisco..

Le scritte sono nella RAM del display LCD 16x2 , finchè non vengono sostituite o cancellate tramite un lcd.clear() rimangono lì.

questo

long duration = pulseIn( echoPort, HIGH );
long r = 0.034 * duration / 2;

è sbagliato

unsigned long duration = pulseIn( echoPort, HIGH );
unsigned long r = (duration) ? 0.034 * duration / 2 : 40000;

anche se penso non sia quello il problema
posta lo schema esatto che stai usando