Problema led ed info pulsante

Buonasera a tutti,
ho un problema con il programma e un consiglio da chiedere,
praticamente il led "led3R", nello schetch che metto, mi fa dei lampeggi strani, lampeggia velocemente per circa mezzo secondo per poi fermarsi per un altro mezzo secondo e per poi ripartire, in piu ha una luce fiacca come se avesse il triplo di resistenza, se invece nello schetch elimino tutte le parti interessate al comando dei led mi rimane acceso ma sempre con la luce fiacca, se invece su un altro schetch accendo tutti led normalmente si accendono tutti senza problemi con la luce giusta quindi ho escluso il problema del collegamento elettrico, non riesco a venirne fuori aiutoo
Poi dovrei utilizzare un pulsante come interruttore, nello schetch non l'ho ancora messo ma dovrei "creare" due stati in cui uno fa tutto quello che c'é nello schetch mentre l'altro stato deve portarmi tutto in "standby" portando in una posizione definita i servo e spegnendo tutti i led, ho provato piu volte ma non funziona, secondo me sbagliavo qualcosa con il ritardo per il debounce, se potete aiutarmi a creare i due stati vi sarei grato
Ecco lo schetch, non insultatemi è il mio primo programma che faccio diverso dal "accendi spegni led", grazie :slight_smile:

#include <Servo.h>
Servo servo1;
Servo servo2;
int val1=0;
int val2=0;
int val3=0;
int val4=0;
int toll1;
int toll2;
int toll3;
int toll4;
int grado1=90;
int maxGrado1=150;
int minGrado1=15;
int grado2=90;
int maxGrado2=180;
int minGrado2=0;
int pausa=12;
int T=50;
int TT=55;
int TTT=120;
int led3G=9;
int led3R=8;
int led3B=7;
int led2G=6;
int led2R=5;
int led2B=4;
int led1G=3;
int led1R=2;
int led1B=1;
int button=0;
long timeled=500;
long timeledbatt=200;
long tim;
int letturabatteria=5;
int batt;
long timbatt;

void setup() {
 servo1.attach(10);
 servo2.attach(11);
 pinMode(led1B, OUTPUT);
 pinMode(led1G, OUTPUT);
 pinMode(led1R, OUTPUT);
 pinMode(led2B, OUTPUT);
 pinMode(led2G, OUTPUT);
 pinMode(led2R, OUTPUT);
 pinMode(led3B, OUTPUT);
 pinMode(led3G, OUTPUT);
 pinMode(led3R, OUTPUT);
 pinMode(button, INPUT);
 
 tim=millis();
 timbatt=millis();
}

void loop() {
 //gestione servo
 val1=analogRead(A0);
 val2=analogRead(A2);
 val3=analogRead(A3);
 val4=analogRead(A4);
 toll1=abs(val1-val4);
 toll2=abs(val3-val2);
 toll3=abs(val1-val2);
 toll4=abs(val4-val3);
 if((toll1<T) && (toll2<T)) servo1.detach(); else servo1.attach(8);
 if((toll3<T) && (toll4<T)) servo2.detach(); else servo2.attach(10);
 
 if((val1>val4) && (toll1>TT)){
  grado1++;
  delay(pausa);
 }
  if((val2>val3) && (toll2>TT)){
  grado1++;
  delay(pausa);
 }
 if((val4>val1) && (toll1>TT)){
  grado1--;
  delay(pausa);
 }
  if((val3>val2) && (toll2>TT)){
  grado1--;
  delay(pausa);
 }
 
 if((val1>val2) && (toll3>TT)){
  grado2--;
  delay(pausa);
 }
 if((val4>val3) && (toll4>TT)){
  grado2--;
  delay(pausa);
 }
 if((val2>val1) && (toll3>TT)){
  grado2++;
  delay(pausa);
 }
 if((val3>val4) && (toll4>TT)){
  grado2++;
  delay(pausa);
 }
 //gestione led
 if((toll1>TTT)||(toll2>TTT)||(toll3>TTT)||(toll4>TTT)){
  if((millis() - tim)>=timeled){
  digitalWrite(led2R, !digitalRead(led2R));
  digitalWrite(led2G, LOW);
  tim=millis();
  }
 }
 else{
  digitalWrite(led2G, HIGH);
  digitalWrite(led2R, LOW);
 }
  
 
 if(grado1>maxGrado1) {grado1=maxGrado1;}
 if(grado1<minGrado1) {grado1=minGrado1;}
 if(grado2>maxGrado2) {grado2=maxGrado2;}
 if(grado2<minGrado2) {grado2=minGrado2;}
 
 
 
 servo1.write(grado1);
 delay(pausa);
 servo2.write(grado2);
 delay(pausa);
 
 //gestione led livello batteria
 batt=analogRead(letturabatteria);
 if((batt<=860) && (batt>=818)){
  digitalWrite(led3B, HIGH);
  digitalWrite(led3G, LOW);
  digitalWrite(led3R, LOW);
 }
 if((batt<=847) && (batt>=777)){
  digitalWrite(led3B, LOW);
  digitalWrite(led3G, HIGH);
  digitalWrite(led3R, LOW);
 }
 if((batt<=776) && (batt>=737)){
  digitalWrite(led3B, LOW);
  digitalWrite(led3G, HIGH);
  digitalWrite(led3R, HIGH);
 }
 if((batt<=736) && (batt>=696)){
  digitalWrite(led3B, LOW);
  digitalWrite(led3G, LOW);
  digitalWrite(led3R, HIGH);
 }
 if((batt<=695) && (batt>=10)){
  if((millis() - timbatt)>=timeledbatt){
  digitalWrite(led3R, !digitalRead(led3R));
  digitalWrite(led3G, LOW);
  digitalWrite(led3B, LOW);
  timbatt=millis();
  }
  else{
  digitalWrite(led3G, LOW);
  digitalWrite(led3B, LOW);
  digitalWrite(led3R, LOW);
  }
 }
 if((batt<=9) && (batt>=0)){
  digitalWrite(led3G, HIGH);
  digitalWrite(led3B, HIGH);
  digitalWrite(led3R, HIGH);
 }
}

scommetto che alimenti tutto con i 5V di arduino :smiley:

Sii, tranne i servo che ho l'alimentazione esterna per loro , ma qual'é il problema? :confused:

nulla, pensavo fosse quello il problema....

allora per cominciare cambia tutte le variabili che memorizzano i tempi (millis()) in unsigned long
nel secondo if della gestione led batteria hai messo un valore errato

 if ((batt <= 847) && (batt >= 777)) {

presumo debba essere 817

hai provato ad incrementare timeledbatt? magari portalo a 500
a cosa ti serve qui la pausa?

 if ((val1 > val4) && (toll1 > TT)) {
      grado1++;
      delay(pausa);
   }

è solo un calcolo matematico

   if (grado1 > maxGrado1) {
      grado1 = maxGrado1;
   }
   if (grado1 < minGrado1) {
      grado1 = minGrado1;
   }
   if (grado2 > maxGrado2) {
      grado2 = maxGrado2;
   }
   if (grado2 < minGrado2) {
      grado2 = minGrado2;
   }

queste le semplifichi così

   grado1 =constrain(grado1,minGrado1, maxGrado1) ;
   grado2 =constrain(grado2,minGrado2, maxGrado2) ;

Patrick_M:
hai provato ad incrementare timeledbatt? magari portalo a 500

Infatti credo che sia quello il problema, perché col valore 200 quel led fa 5 blink al secondo.
Io lo porterei a 1000, così almeno lampeggia 1 volta al secondo.

Oppure per cambiare il rapporto tra on e off, ad esempio mezzo secondo ON e poi un secondo OFF:

  if((millis() - timbatt)>=timeledbatt){
  digitalWrite(led3R, !digitalRead(led3R));
  digitalWrite(led3G, LOW);
  digitalWrite(led3B, LOW);
  timbatt=millis();
  if ( digitalRead(led3R) )
    timeledbatt = 500; // tempo ON
  else
    timeledbatt = 1000; // tempo OFF
  }

Ciao, grazie hai ragione era 817, la pausa serve per rallentare i servo, vanno troppo veloci per quello che devono muovere e non riescono a fermarsi nel punto giusto perchè per inerzia vanno quei 2-3 gradi oltre il punto di stop quindi mi ritrovo che la struttura "trema" per un po' quando deve fermarsi,
ho scoperto che se tolgo tutti i delay i led funzionano perfettamente

#include <Servo.h>
Servo servo1;
Servo servo2;
int val1=0;
int val2=0;
int val3=0;
int val4=0;
int toll1;
int toll2;
int toll3;
int toll4;
int grado1=90;
int maxGrado1=150;
int minGrado1=15;
int grado2=90;
int maxGrado2=180;
int minGrado2=0;
int pausa=12;
int T=50;
int TT=55;
int TTT=120;
int led3G=9;
int led3R=8;
int led3B=7;
int led2G=6;
int led2R=5;
int led2B=4;
int led1G=3;
int led1R=2;
int led1B=1;
int button=0;
int timeled=500;
int timeledbatt=200;
unsigned long tim;
int letturabatteria=5;
long batt;
unsigned long timbatt;

void setup() {
 servo1.attach(10);
 servo2.attach(11);
 pinMode(led1B, OUTPUT);
 pinMode(led1G, OUTPUT);
 pinMode(led1R, OUTPUT);
 pinMode(led2B, OUTPUT);
 pinMode(led2G, OUTPUT);
 pinMode(led2R, OUTPUT);
 pinMode(led3B, OUTPUT);
 pinMode(led3G, OUTPUT);
 pinMode(led3R, OUTPUT);
 pinMode(button, INPUT);
 
 tim=millis();
 timbatt=millis();
}

void loop() {
 //gestione servo
 val1=analogRead(A0);
 val2=analogRead(A2);
 val3=analogRead(A3);
 val4=analogRead(A4);
 toll1=abs(val1-val4);
 toll2=abs(val3-val2);
 toll3=abs(val1-val2);
 toll4=abs(val4-val3);
 if((toll1<T) && (toll2<T)) servo1.detach(); else servo1.attach(8);
 if((toll3<T) && (toll4<T)) servo2.detach(); else servo2.attach(10);
 
 if((val1>val4) && (toll1>TT)){
  grado1++;
  
 }
  if((val2>val3) && (toll2>TT)){
  grado1++;
  
 }
 if((val4>val1) && (toll1>TT)){
  grado1--;
  
 }
  if((val3>val2) && (toll2>TT)){
  grado1--;
  
 }
 
 if((val1>val2) && (toll3>TT)){
  grado2--;
  
 }
 if((val4>val3) && (toll4>TT)){
  grado2--;
  
 }
 if((val2>val1) && (toll3>TT)){
  grado2++;
  
 }
 if((val3>val4) && (toll4>TT)){
  grado2++;
  
 }
 //gestione led
 if((toll1>TTT)||(toll2>TTT)||(toll3>TTT)||(toll4>TTT)){
  if((millis() - tim)>=timeled){
  digitalWrite(led2R, !digitalRead(led2R));
  digitalWrite(led2G, LOW);
  tim=millis();
  }
 }
 else{
  digitalWrite(led2G, HIGH);
  digitalWrite(led2R, LOW);
 }
  
 
 grado1 =constrain(grado1,minGrado1, maxGrado1) ;
 grado2 =constrain(grado2,minGrado2, maxGrado2) ;
 
 
 
 servo1.write(grado1);
 
 servo2.write(grado2);
 
 
 //gestione led livello batteria
 batt=analogRead(letturabatteria);
 if((batt<=860) && (batt>=818)){
  digitalWrite(led3B, HIGH);
  digitalWrite(led3G, LOW);
  digitalWrite(led3R, LOW);
 }
 if((batt<=817) && (batt>=777)){
  digitalWrite(led3B, LOW);
  digitalWrite(led3G, HIGH);
  digitalWrite(led3R, LOW);
 }
 if((batt<=776) && (batt>=737)){
  digitalWrite(led3B, LOW);
  digitalWrite(led3G, HIGH);
  digitalWrite(led3R, HIGH);
 }
 if((batt<=736) && (batt>=696)){
  digitalWrite(led3B, LOW);
  digitalWrite(led3G, LOW);
  digitalWrite(led3R, HIGH);
 }
 if((batt<=695) && (batt>=10)){
  if((millis() - timbatt)>=timeledbatt){
  digitalWrite(led3R, !digitalRead(led3R));
  digitalWrite(led3G, LOW);
  digitalWrite(led3B, LOW);
  timbatt=millis();
  }
  else{
  digitalWrite(led3G, LOW);
  digitalWrite(led3B, LOW);
  digitalWrite(led3R, LOW);
  }
 }
 if((batt<=9) && (batt>=0)){
  digitalWrite(led3G, HIGH);
  digitalWrite(led3B, HIGH);
  digitalWrite(led3R, HIGH);
 }
}

se invece tolgo tutti i codici interessati ai led questa volta si accende sempre in modo fiacco sia il led del pin 1 sia quello del pin 8

#include <Servo.h>
Servo servo1;
Servo servo2;
int val1=0;
int val2=0;
int val3=0;
int val4=0;
int toll1;
int toll2;
int toll3;
int toll4;
int grado1=90;
int maxGrado1=150;
int minGrado1=15;
int grado2=90;
int maxGrado2=180;
int minGrado2=0;
int pausa=12;
int T=50;
int TT=55;
int TTT=120;
int button=0;



void setup() {
 servo1.attach(10);
 servo2.attach(11);

 pinMode(button, INPUT);
 
 
}

void loop() {
 //gestione servo
 val1=analogRead(A0);
 val2=analogRead(A2);
 val3=analogRead(A3);
 val4=analogRead(A4);
 toll1=abs(val1-val4);
 toll2=abs(val3-val2);
 toll3=abs(val1-val2);
 toll4=abs(val4-val3);
 if((toll1<T) && (toll2<T)) servo1.detach(); else servo1.attach(8);
 if((toll3<T) && (toll4<T)) servo2.detach(); else servo2.attach(10);
 
 if((val1>val4) && (toll1>TT)){
  grado1++;
  
 }
  if((val2>val3) && (toll2>TT)){
  grado1++;
  
 }
 if((val4>val1) && (toll1>TT)){
  grado1--;
  
 }
  if((val3>val2) && (toll2>TT)){
  grado1--;
  
 }
 
 if((val1>val2) && (toll3>TT)){
  grado2--;
  
 }
 if((val4>val3) && (toll4>TT)){
  grado2--;
  
 }
 if((val2>val1) && (toll3>TT)){
  grado2++;
  
 }
 if((val3>val4) && (toll4>TT)){
  grado2++;
  
 }
 
  
 
 grado1 =constrain(grado1,minGrado1, maxGrado1) ;
 grado2 =constrain(grado2,minGrado2, maxGrado2) ;
 
 
 
 servo1.write(grado1);
 
 servo2.write(grado2);
 
 
 
}

se invece faccio, togliendo la parte dei led e lasciando i delay, mi si accende in modo fiacco solo il led del pin 8

#include <Servo.h>
Servo servo1;
Servo servo2;
int val1=0;
int val2=0;
int val3=0;
int val4=0;
int toll1;
int toll2;
int toll3;
int toll4;
int grado1=90;
int maxGrado1=150;
int minGrado1=15;
int grado2=90;
int maxGrado2=180;
int minGrado2=0;
int pausa=12;
int T=50;
int TT=55;
int TTT=120;
int led3G=9;
int led3R=8;
int led3B=7;
int led2G=6;
int led2R=5;
int led2B=4;
int led1G=3;
int led1R=2;
int led1B=1;
int button=0;
int timeled=500;
int timeledbatt=200;
unsigned long tim;
int letturabatteria=5;
long batt;
unsigned long timbatt;

void setup() {
 servo1.attach(10);
 servo2.attach(11);
 pinMode(led1B, OUTPUT);
 pinMode(led1G, OUTPUT);
 pinMode(led1R, OUTPUT);
 pinMode(led2B, OUTPUT);
 pinMode(led2G, OUTPUT);
 pinMode(led2R, OUTPUT);
 pinMode(led3B, OUTPUT);
 pinMode(led3G, OUTPUT);
 pinMode(led3R, OUTPUT);
 pinMode(button, INPUT);
 
 tim=millis();
 timbatt=millis();
}

void loop() {
 //gestione servo
 val1=analogRead(A0);
 val2=analogRead(A2);
 val3=analogRead(A3);
 val4=analogRead(A4);
 toll1=abs(val1-val4);
 toll2=abs(val3-val2);
 toll3=abs(val1-val2);
 toll4=abs(val4-val3);
 if((toll1<T) && (toll2<T)) servo1.detach(); else servo1.attach(8);
 if((toll3<T) && (toll4<T)) servo2.detach(); else servo2.attach(10);
 
 if((val1>val4) && (toll1>TT)){
  grado1++;
  delay(pausa);
  
 }
  if((val2>val3) && (toll2>TT)){
  grado1++;
  delay(pausa);
 }
 if((val4>val1) && (toll1>TT)){
  grado1--;
  delay(pausa);
 }
  if((val3>val2) && (toll2>TT)){
  grado1--;
  delay(pausa);
 }
 
 if((val1>val2) && (toll3>TT)){
  grado2--;
  delay(pausa);
 }
 if((val4>val3) && (toll4>TT)){
  grado2--;
  delay(pausa);
 }
 if((val2>val1) && (toll3>TT)){
  grado2++;
  delay(pausa);
 }
 if((val3>val4) && (toll4>TT)){
  grado2++;
  delay(pausa);
 }
 
  
 
 grado1 =constrain(grado1,minGrado1, maxGrado1) ;
 grado2 =constrain(grado2,minGrado2, maxGrado2) ;
 
 
 
 servo1.write(grado1);
 delay(pausa);
 servo2.write(grado2);
 delay(pausa);
 
}

invece mettendo questo schetch (una sequenza di accendi spegni) funziona tutto ok

int led3G=9;
int led3R=8;
int led3B=7;
int led2G=6;
int led2R=5;
int led2B=4;
int led1G=3;
int led1R=2;
int led1B=1;
void setup() {
  pinMode(led1B, OUTPUT);
  pinMode(led1G, OUTPUT);
  pinMode(led1R, OUTPUT);
  pinMode(led2B, OUTPUT);
  pinMode(led2G, OUTPUT);
  pinMode(led2R, OUTPUT);
  pinMode(led3B, OUTPUT);
  pinMode(led3G, OUTPUT);
  pinMode(led3R, OUTPUT);

}

void loop() {
 digitalWrite(led1B, HIGH);
 digitalWrite(led2B, HIGH);
 digitalWrite(led3B, HIGH);
 digitalWrite(led1R, LOW);
 digitalWrite(led2R, LOW);
 digitalWrite(led3R, LOW);
 digitalWrite(led1G, LOW);
 digitalWrite(led2G, LOW);
 digitalWrite(led3G, LOW);
 delay(2000);
 digitalWrite(led1G, HIGH);
 digitalWrite(led2G, HIGH);
 digitalWrite(led3G, HIGH);
 digitalWrite(led1R, LOW);
 digitalWrite(led2R, LOW);
 digitalWrite(led3R, LOW);
 digitalWrite(led1B, LOW);
 digitalWrite(led2B, LOW);
 digitalWrite(led3B, LOW);
 delay(2000);
 digitalWrite(led1R, HIGH);
 digitalWrite(led2R, HIGH);
 digitalWrite(led3R, HIGH);
 digitalWrite(led1B, LOW);
 digitalWrite(led2B, LOW);
 digitalWrite(led3B, LOW);
 digitalWrite(led1G, LOW);
 digitalWrite(led2G, LOW);
 digitalWrite(led3G, LOW);
 delay(2000);
 digitalWrite(led1R, HIGH);
 digitalWrite(led2R, HIGH);
 digitalWrite(led3R, HIGH);
 digitalWrite(led1B, HIGH);
 digitalWrite(led2B, HIGH);
 digitalWrite(led3B, HIGH);
 digitalWrite(led1G, LOW);
 digitalWrite(led2G, LOW);
 digitalWrite(led3G, LOW);
 delay(2000);
 digitalWrite(led1R, HIGH);
 digitalWrite(led2R, HIGH);
 digitalWrite(led3R, HIGH);
 digitalWrite(led1B, LOW);
 digitalWrite(led2B, LOW);
 digitalWrite(led3B, LOW);
 digitalWrite(led1G, HIGH);
 digitalWrite(led2G, HIGH);
 digitalWrite(led3G, HIGH);
 delay(2000);
 digitalWrite(led1R, LOW);
 digitalWrite(led2R, LOW);
 digitalWrite(led3R, LOW);
 digitalWrite(led1B, HIGH);
 digitalWrite(led2B, HIGH);
 digitalWrite(led3B, HIGH);
 digitalWrite(led1G, HIGH);
 digitalWrite(led2G, HIGH);
 digitalWrite(led3G, HIGH);
 delay(2000);
 digitalWrite(led1R, HIGH);
 digitalWrite(led2R, HIGH);
 digitalWrite(led3R, HIGH);
 digitalWrite(led1B, HIGH);
 digitalWrite(led2B, HIGH);
 digitalWrite(led3B, HIGH);
 digitalWrite(led1G, HIGH);
 digitalWrite(led2G, HIGH);
 digitalWrite(led3G, HIGH);
 delay(2000);

}

Cosa potrebbe essere? pensavo subito al delay ma se lo tolgo mi rimane acceso fiacco, da qui posso dedurre che in realtà il lampeggio e dovuto al fatto che il delay bloccando il programma spenga per quel tempo il led e quindi ne risulti un lampeggio strano, ma allora perche si accende il led? Tra l'altro con luce fiacca
Ho provato ad aumentare il timeledbatt a 1000 ma nulla ne risulta solo il lampeggio piu lento (ad occhio circa 3Hz) :confused: :confused:

le uniche pause che ti servono per i servo sono queste
ovvio che ora sono impostate a 12 millisecondi.... meno di un battito di ciglia

porta pausa ad un valore ragionevole (almeno 200-300) ed elimina le altre che non servono a nulla

servo1.write(grado1);
 delay(pausa);
 servo2.write(grado2);
 delay(pausa);

nei 2 pezzi di programma che hai postato , nel primo non hai definito nulla nel setup.... ovvio che non si accendevano i led
nel secondo non vi sono led da accendere.... quindi non capisco come faccia il led ad accendesri in modo fiacco :smiley:

Con le pause mi ricordo che ho fatto come hai detto ma non andava, provando cosi come ho fatto invece va bene, comunque ho risolto mettendo il pin in "LOW" anche se comunque mi sembra strano, poi ho notato che succede solo sui pin 1 e 8, non lo so è quasi come se ci fosse una piccola fuga di tensione, vabbè grazie comunque :wink: :wink:

Comunque io ti darei qualche consiglio di ordine generale sulle variabili (vedere una sfilza di int all'inizio mi da il nervoso):
Comincia a mettere byte tutte quelle il cui valore non superi 204
Poi metti bool tutte quelle o vere o false
Dopo di che sostituisci con #define tutte quelle il cui valore non cambia (esempio di uso

#define NOMEDICOSTANTE 123

E da qui ogni volta che il compilatore trova NOMEDICOSTANTE lo sostituisce con 123. Puoi anche mettere #define più complesse come funzioni o altro, ma non esageriamo.
Perché tutto ciò? Perché di norma la memoria di Arduino é fattore likitante, meglio usarla bene (e si può fare anche meglio)