Progetto Arduino

Ma scusa, quale parte di "anche senza postare codice" non era chiara? :o

Dicevamo di descrivere solo la parte di collegamenti, come tra l'altro ha fatto pure brunello, poi il codice se la vede l'OP (anche perché secondo me non ha nessun codice, ha detto che non sa come realizzarlo, quindi se prima non si identificano almeno i collegamenti ed il metodo di lettura, che codice potrà mai fare?)...

fai 5 uscite per le 5 viti
10 ingressi input pullup per i cavi due a due rossi-verdi gialli e via così
in un ciclo, abbassi l'uscita, vedi se si abbassano tutti e due gli ingressi corrispondenti
se si accendi, altrimenti ri-alzi l'uscita e passi al successivo
il difficile è farlo in sole 17 righe, la mia èè una stima:
1 riga per dichiarare un array di piedini ingressi, uno di piedini uscite e un piedino di buzzer
sono tutte byte e fa una riga sola
due righe: un ciclo for per dichiarare i piedini di ingresso e siamo a tre
tre righe per un ciclo for che dichiara e alza le uscite e siamo a sei
una riga per dichiarare il buzzer, e siamo a sette
3 righe per un for con due digitalwrite che abbassano e alzano l'uscita e siamo a 10
4 righe un if con due digitalwrite e un delay che fanno suonare il buzzer e siamo a 14
le due void loop e void setup, e siamo a 16
sì, mi sa che ho cappellato, bastano 16 righe
quasi quasi provo a scriverlo veramente...........

Confermato, 16 righe, con un solo statement per riga, altrimenti è troppo facile...........
EDIT
vorrei chiarirmi:
non è che sto qui a giocare a chi c'è lo ha piu' corto, sarebbe stupido, oltre che inutile
è tutto nato dal confronto tra una soluzione analogica, complicatissima, con una digitale, che è invece di una semplicità disarmante
per quanto riguarda la soluzione analogica, con 5 ingressi, è ancora più semplice, ma non c'è "sugo" a seguirla
invece quella con un solo ingresso sarebbe una bella sfida, ma non serve nemmeno arduino, basta un comparatore a finestra, il problema sono le resistenza calibrate, molto calibrate
10 cavi che possono andare su 6 posizioni (va contato anche il caso "non lo attacco da nessuna parte") fanno una caterva di possibili combinazioni, e calcolare un partitore che ne riconosca una sola non è banale
se si potesse rilassare un poco la prescrizione, che ne so, che suoni anche per alcuni falsi positivi, pur se improbabili, come a dire attacco tutti i fili tutti alla stessa vite....
o magari mettendo non 5 viti e 10 fili, ma 5 + 10 viti con solo due collegamenti volanti tra i tre gruppi di viti...
questo ridurrebbe moltissimo la complessità del calcolo del partitore

Dovrei esserci riuscito, tutti componenti passivi, riconosce se i cavi sono collegati sulle viti sbagliate, spero anche con un buon margine di incertezza sulle misure
Ho però bisogno di conferme da parte del mio diavolo del silicio preferito
Cominciamo: le viti
Dal 5 volt alla vite 1, diodo polarizzato direttamente su vite 2, diodo polari......
Insomma 4 diodi su 4 viti, la prima al 5 volt
Fili lato destro: dal filo 1 un diodo al filo 2, un diodo filo 3 etc
In fondo un resistore al meno, calcolo a dopo ma I deve essere bassa
Filo lato sinistro: uguale
Tra i due resistori due resistenze tra loro uguali, in centro ingresso analogico arduino (o comparatore a finestra)
la tensione al partitore vale 5 meno 4 volte la caduta del diodo solo se collego i fili giusti, altrimenti maggiore o minore
Se collego un solo filo, pur se giusto, al centro tra i due partitori la tensione sarebbe troppo bassa o troppo alta
Se collego un filo ok e uno sbagliato la tensione al centro sarebbe parimenti sbagliata
Unico caso di tensione uguale al calcolato solo se due fili sono sulla vite giusta
Diavolo del silicio: ci ho pigliato con le approssimazioni sul comportamento dei diodi?

Standardoil:
fai 5 uscite per le 5 viti
10 ingressi input pullup per i cavi due a due rossi-verdi gialli e via così
in un ciclo, abbassi l'uscita, vedi se si abbassano tutti e due gli ingressi corrispondenti
se si accendi, altrimenti ri-alzi l'uscita e passi al successivo
...
Dal 5 volt alla vite 1, diodo polarizzato direttamente su vite 2, diodo polari......
Insomma 4 diodi su 4 viti, la prima al 5 volt

Ecco, intendevo questo! :slight_smile:
La soluzione è buona, mi piace, se funziona come descritto (per ora non vedo controindicazioni) complimenti per l'intuizione!

PS comunque tu qui se non ho capito male sfrutti anche gli analogici a differenza di me che stupidamente avevo trascurato la cosa, concentrandomi solo sulla richiesta iniziale che citava il partitore, quando la soluzione digitale è sicuramente la migliore... :wink:
Poi per il flusso ok, non c'è bisogno di descriverlo, lo vedrà l'OP.

Standardoil:
non è che sto qui a giocare a chi c'è lo ha piu' corto, sarebbe stupido, oltre che inutile

Beh tranquillo, in ogni caso per me è divertente pure questo tipo di sfide, quindi nessun problema! Anzi!... :smiley:

Va che quelle che hai citato sono due soluzioni differenti
La prima usa 16 pin digitali (e quindi usa alcuni dei pin "alti" quelli che chiamiamo analogici)
La seconda, che non va, usa un solo ingresso analogico, e nessuna uscita, e farebbe un solo test, di fatto, se andasse, andrebbe anche senza Arduino, con un comparatore a finestra
Ho già la sua sostituta....
Ma vediamo se ci sono novità dallo OP

>VittoM: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

VittoM:
Quando due fili di uno stesso colore toccano la vite di quel colore allora suona un buzzer.
Ad esempio quando D e H toccano la vite gialla o B e F la verde

VittoM ..oltre a ricordarti di usare sempre il tag code (che vedo hai già sistemato) ti direi anche di non modificare il post originario mettendoci gli aggiornamenti e la tua nuova versione, altrimenti non si capisce più nulla, si perde il filo logico della discussione!

Bensì rispondi qui sotto scrivendoci quello che hai messo ora nel primo post (e rimuovi quelle ultime aggiunte, codice compreso, dal primo post lasciandolo com'era all'inizio) .

Buongiorno, ho provato a semplificare il problema: basta che solo un cavo di un colore sia posizionato sulla vite di quel colore. Ho posto una resistenza fissa e 10 resistenze diverse per ogni cavo e ho provato a usare il partitore. Quando tutte le viti toccano con almeno un cavo di quel colore, si preme un bottone e si accendono 3 led.
Girando un pò su internet ho scritto questo codice(ben oltre le 16/17 righe che proponete voi):

  int pin_Blu=0;         //pin blu A0
  int pin_Giallo=1;     //pin giallo A1
  int pin_Rosso=2;         //pin rosso A2
  int pin_Verde=3;        //pin verde A3
  int pin_Nero=4;        //pin negro A4
  double Vin=4.77000;     //tensione in ingresso
  double V1,V2,V3,V4,V5;  //tensione rilevata
  double Vblu,Vgiallo,Vrosso,Vverde,Vnero; //tensione per ogni colore
  double R=2200.000;      //resistenza fissa
  double R1,R2,R3,R4,R5,R6,R7,R8,R9,R10;  //resistenza per ogni cavo
  int val=0;
  char Z1,Z2,Z3,Z4,Z5;    

void setup() {
  pinMode(pin_Blu,INPUT);
  pinMode(pin_Giallo,INPUT);
  pinMode(pin_Rosso,INPUT);
  pinMode(pin_Verde,INPUT);
  pinMode(pin_Nero,INPUT);
  pinMode(3,INPUT);
  pinMode(2,OUTPUT);              //led1
  pinMode(1,OUTPUT);              //led2
  pinMode(0,OUTPUT);              //led3
}

void loop() {
  V1=analogRead(pin_Blu);
  V2=analogRead(pin_Giallo);
  V3=analogRead(pin_Rosso);
  V4=analogRead(pin_Verde);
  V5=analogRead(pin_Nero);
  Vblu=(V1/1023)*Vin;
  Vgiallo=(V2/1023)*Vin;
  Vrosso=(V3/1023)*Vin;
  Vverde=(V4/1023)*Vin;
  Vnero=(V5/1023)*Vin;
  R1=Vblu*R/(Vin-Vblu);
  R6=Vblu*R/(Vin-Vblu);
  R2=Vgiallo*R/(Vin-Vgiallo);
  R7=Vgiallo*R/(Vin-Vgiallo);
  R3=Vrosso*R/(Vin-Vrosso);
  R8=Vrosso*R/(Vin-Vrosso);
  R4=Vverde*R/(Vin-Vverde);
  R9=Vverde*R/(Vin-Vverde);
  R5=Vnero*R/(Vin-Vnero);
  R10=Vnero*R/(Vin-Vnero);
  val=digitalRead(3);
  if(R1==220.000){        //blu collegato bene
    Z1='S';
  }
  else if(R6==820.000){   //blu collegato bene
    Z1='S';
  }
  else{                   //blu collegato male
    Z1='N';              
  }
  if(R2==330.000){        //giallo collegato bene
    Z2='S';
  }
  else if(R7==1000.000){  //giallo collegato bene
    Z1='S';
  }
  else{                   //giallo collegato male
    Z2='N';              
  }
  if(R3==470.000){        //rosso collegato bene
    Z3='S';
  }
  else if(R8==1200.000){  //rosso collegato bene
    Z3='S';
  }
  else{                   //rosso collegato male
    Z3='N';              
  }
  if(R4==560.000){        //verde collegato bene
    Z4='S';
  }
  else if(R9==1500.000){  //verde collegato bene
    Z4='S';
  }
  else{                   //verde collegato male
    Z4='N';               
  }
  if(R5==680.000){        //nero collegato bene
    Z5='S';
  }
  else if(R10==1800.000){ //nero collegato bene
    Z5='S';
  }
  else{                   //nero collegato male
    Z5='N';
  }
  if((Z1=='S')&&(Z2=='S')&&(Z3=='S')&&(Z4=='S')&&(Z5=='S')&&(val==HIGH)){
    digitalWrite(2,HIGH);
    digitalWrite(1,HIGH);
    digitalWrite(0,HIGH);
  }
  else{
    digitalWrite(2,LOW);
    digitalWrite(1,LOW);
    digitalWrite(0,LOW);
  }
}

Sono sicurissimo che ci sono tantissimi metodi e codici più semplici e migliori di questo, scusate per gli orrori che sicuramente ci saranno.

Ma funziona?
Lo hai provato?

L'ho provato su proteus ma i led non si accendono

Intendevo dal vero

No comunque non funziona

Ci sono vari errori
A partire da un inadeguato uso dei tipi di variabile
Per finire una generale confusione nel previsto funzionamento
Metti un filo solo o due dello stesso colore su ogni vite?
Colleghi una vite sola o tutte?
I led si devono accendere quando almeno un filo del colore giusto è sulla vite giusta, o quando tutte i fili sono connessi?
Perché usi due differenti resistenze per i due fili dello stesso colore?
Perché usi i pin 0 e 1 che sono la seriale?
Perché non tieni conto delle tolleranze delle resistenze
Perché usi tre uscite per una sola azione?