Problema con uno sketch

Salve a tutti…
Avrei un problemino con un progetto che sto realizzando. Il progetto consiste nel creare un sistema di votazioni formato da 15 enti che usi arduino e un display a 4 righe per dare i risultati. In pratica ogni postazione avrà due pulsanti uno per il SI e uno per il NO. Nel display dovrà comparire quante persona hanno votato si, quante hanno votato no e infine quanti astenuti ci sono. Ho fatto una bozza con solo due votanti ma credo non funzioni :roll_eyes:
Chiedo il vostro aiuto XD XD

#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,10,9,8,7);
int P1Pin = 2;
int P2Pin = 3;
int P3Pin = 4;
int P4Pin = 5;

int P1State = 0;
int P2State = 0;
int P3State = 0;
int P4State = 0;

int VotiSi = 0;
int VotiNo = 0;
int Assenti = 2;
int A=0;
int B=0;
int C=0;


void setup() 
{
  lcd.begin(16, 4);
  
  pinMode(P1Pin, INPUT);
  pinMode(P2Pin, INPUT);
  pinMode(P3Pin, INPUT);
  pinMode(P4Pin, INPUT); 
}

void loop() 
{
//1° votante  
 //SI
 if (P1Pin=HIGH)
  {
    P1State=1;
  }
 else
  {
    P1State=0;
  }
  if (P1State=1)
  {
    A=VotiSi+1;
  }
 //NO
  if (P2Pin=HIGH)
  {
    P2State=1;
  }
 else
  {
    P2State=0;
  }
  if (P2State=1)
  {
    B=VotiNo+1;
  }
 //ASTENUTO
if (P1State==0 && P2Pin==0)
{
  C=Assenti-1;
}

//2° votante  
   //SI
 if (P3Pin=HIGH)
  {
    P3State=1;
  }
 else
  {
    P3State=0;
  }
  if (P3State=1)
  {
    A=A+1;
  }
 //NO
  if (P4Pin=HIGH)
  {
    P4State=1;
  }
 else
  {
    P4State=0;
  }
  if (P4State=1)
  {
    B=B+1;
  }
 //ASTENUTO
if (P3State==0 && P4Pin==0)
{
  C=C-1;
}

 //visualizzazione
    lcd.setCursor(0, 0);
    lcd.print("Risultati Votazione:");
    
    lcd.setCursor(1,1);
    lcd.print("SI:");
    lcd.setCursor(5,1);
    lcd.print(A);
    
    lcd.setCursor(1,2);
    lcd.print("NO:");
    lcd.setCursor(5,2);
    lcd.print(B);
    
    lcd.setCursor(1,4);
    lcd.print("Astenuti:");
    lcd.setCursor(10,4);
    lcd.print(C);
}

Sei alle prime armi???

if (P1Pin=HIGH) ci vuole un ==

A=VotiSi+1; A sará sempre 0 o 1 mai piú alto C=Assenti-1; C sará sempre 1

if (P4Pin=HIGH)
  {
    P4State=1;
  }
 else
  {
    P4State=0;
  }
  if (P4State=1)
  {
    B=B+1;
  }

B sará alle Stelle

if (P3State==0 && P4Pin==0)
{
  C=C-1;
}

e C in cantina.

Devi: Fare il debouce Triggerare un pulsante premuto sul cambio LOW-HIGH senó lo conti piú volte. Gli astenuti li controlli togliendo dall nr totale di aventi diritto i voti si e i voti no.

Ciao Uwe

Il c sarà sempre 1 in questo caso perche io per prova ho provato con due soli pulsanti ma in finale saranno 15 e ogni volta dovrebbe fare -1 ... Uwe si sono alle prime armi con la programmazione in Arduino se potresti darmi una mano te ne sarei molto grato :)

Se ho capito bene vorresti collegare 15 coppie di pulsanti ad Arduino (15 si e 15 no) per far votare 15 persone contemporaneamente giusto? Il programma dovrebbe leggere i pulsanti e chiusa la votazione dare il risultati dei totale dei si, dei no e degli astenuti. Cosi?

Esatto a fine votazione o in tempo reale deve cambiare i valori dei si dei no e degli astenuti

Dividi il codice in funzioni in modo da seguire una sequenza logica. Aggiungi un pulsante per iniziare e concludere e resettare le votazioni. Il tuo programma dovrà fare: - inizializzo Arduino (pulsanti, ecc ) - attendo inizio votazione - leggo continuamente lo stato dei pulsanti di voto e memorizzo i valori - premo il pulsante fine votazione - - calcolo punteggi - - visualizzo sul display i risultati - - resetto i voti - ricomincio.

Grazie Paolo, appena rientro provo e vi faccio sapere per quanto riguarda il debouce accenato uwe come lo faccio?

ok, ma con la logica che sta' seguendo, se uno dei votanti preme SI e poi ci ripensa e preme NO ( e poi SI e poi NO etc etc ) i voti alla fine saranno ben piu' del numero dei votanti.

e poi, come pensi di collegare 30 linee ad Arduino ?

Usando un Arduino due

Il debounce è un falso problema perché devi cambiare lo stato del voto nel periodo di votazione. Anche se si dovesse premere più volte il pulsante il voto sarebbe uno perché vai a leggere la variabile di stato e non lo stato del pulsante. Variabile che resetti a fine voto.

Per le linee o passi ad Arduino Mega o usi un expander (tipo il PCF8574).

dima0: Usando un Arduino due

Sei conscio che :

  1. Arduino DUE è molto poco supportato e pochissime librerie di terze parti sono state convertite per funzionarci.
  2. Molti pochi shield sono fatti per funzionare su Arduino DUE.
  3. La scheda funziona esclusivamente a 3.3V e molti dei suoi pin sono in grado di dare un decimo della corrente (max 3 mA) dei pin degli altri Arduino (max 40 mA). I rimanenti comunque non danno più di 15 mA.
  4. E' sicuramente un processore molto più complesso da utilizzare. Basta guardare le oltre 1400 pagine di cui è composto il datasheet
  5. Difficilmente vedrà ulteriori sviluppi dato che ... ora c'è da dedicarsi alle nuove schede.

Insomma ... salvo tu non abbia esigenze veramente particolari e l'esperienza per utilizzare tale scheda, se è solo per una questione di numero di pin ... usa Arduino Mega ... avrai tutto il supporto di cui puoi avere bisogno e la totale compatibilità con la maggior parte degli shield.

Guglielmo

Grazie del consiglio Guglielmo... Provvedere a prendere un Arduino mega allora poiché possiedo un Arduino uno rev3

Buona sera… Mi sono messo 10 minuti al pc ed ho pensato di farlo così il programma però non so dove sbaglio… Vi metto un nuovo sketch fatto adesso. Vi allego la foto del display per farvi vedere che esce :~

#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,10,9,8,7);
int P1Si = 2;
int P2No = 3;
int P3Si = 4;
int P4No = 5;
int ValSi = 0;
int ValNo = 0;
int ValAssenti = 0;
int A=0;
int B=0;

void setup()
{
lcd.begin(16, 4);
pinMode(P1Si, INPUT);
pinMode(P2No, INPUT);
pinMode(P3Si, INPUT);
pinMode(P4No, INPUT);
}

void loop()
{
if (P1Si==HIGH)
{
P1Si==1;
}
else
{
P1Si==0;
}
//—
if (P2No==HIGH)
{
P2No==1;
}
else
{
P2No==0;
}
//—
if (P3Si==HIGH)
{
P3Si==1;
}
else
{
P3Si==0;
}
//—
if (P4No==HIGH)
{
P4No==1;
}
else
{
P4No==0;
}

ValSi=P1Si+P3Si;
ValNo=P2No+P4No;

if (P1Si==LOW && P2No==LOW);
{
A=1;
}
if (P3Si==LOW && P4No==LOW);
{
B=1;
}
ValAssenti=A+B;
lcd.setCursor(0,0);
lcd.print(“Risultati Votazione:”);

lcd.setCursor(1,1);
lcd.print(“SI:”);
lcd.setCursor(5,1);
lcd.print(ValSi);

lcd.setCursor(1,2);
lcd.print(“NO:”);
lcd.setCursor(5,2);
lcd.print(ValNo);

lcd.setCursor(1,4);
lcd.print(“Astenuti:”);
lcd.setCursor(10,4);
lcd.print(ValAssenti);
}

stai facendo un po' di confusione

if (P1Si==HIGH) forse volevi fare if (digitalRead (P1Si==HIGH)).

 P1Si==1;

Vuoi fare un'assegnazione, non un confronto, quindi serve solo un segno di Uguale P1Si = 1

if (P1Si==LOW && P2No==LOW);

Qui devi togliere il puntoevirgola, altrimenti non ti considera le righe successive della condizione