Go Down

Topic: DISTRIBUTORE CARTA UMIDIFICATA (Read 466 times) previous topic - next topic

ltsrl

Jul 09, 2019, 05:03 pm Last Edit: Jul 10, 2019, 09:15 am by ltsrl Reason: Aggiungo una bozza del cablaggio realizzata con Fritzing,
sono nuovo sulla programmazione di Arduino. Vorrei utilizzarlo come una sorta di PLC per rimettere in funzione un vecchio macchinario. Conosco un pochino il linguaggio, ma ho dei problemi sui cicli. Faccio un sunto sul funzionamento della macchina e poi posto il codice che ho compilato, per valutare la correttezza prima di implementare il tutto a bordo macchina.




// Il macchinario, permette l'acquisto di n. 1 panno per la pulizia dell'automobile. Sono disponibili 4 opzioni, di cui 3 umidificate con dei prodotti e 1 asciutto.
// Attraverso un sensore di prossimità posto vicino al rotolo di carta si stabilisce la sua presenza
// Utilizzando delle aste (capacitive??) alimentate, è possibile verificare quando i prodotti sono terminati
// Il sensore OMRON E3F2-DS10C4-N legge la presenza della carta nel vano di spruzzo/strappo e ne blocca il funzionamento fin quando non sia libero ponendo i led di stato in modo e rifiuto monete lampeggiante
// Dopo queste verifiche si restituisce un valore di "stato" ad un led verde o rosso se la carta è disponibile ed i liquidi per le 4 opzioni
// Il cliente introduce la moneta nella gettoniera che genera l'input che attiva i 4 tasti di selezione. I led di stato lampeggiano
// Pigiando sul tasto prescelto/disponibile, il ciclo per fornire il panno corretto si aziona
// Il motoriduttore aziona i rulli e la carta scorre nel vano di spruzzo/strappo
// Prima che avvenga un eventuale spruzzo e il successivo taglio, il sensore OMRON E3F2-DS10C4-N legge la presenza della carta nel vano di spruzzo/strappo
// Mentre la carta scorre, se è necessrio lo spruzzo, questo si avvia durante lo scorrimento della carta
// Il taglio della carta si aziona quando la carta è arrivata alla lunghezza stabilita
// Il sistema di taglio utilizza un micro di fine del ciclo di taglio, in quanto la lama deve tornare in posizione di parternza, altrimenti la carta non si strappa.
// La macchina attende imput da gettoniera
// Il cliente ritira il panno prescelto/disponibile.
// La macchina attende che qualcuno inserisca la moneta

Code: [Select]

int getto = 22;  // gettoniera digital
int inibgetto = 33;  // inibizione gettoniera
int sensrot = 23;  // sensore rotolo digital
int senscart = 24;  // sensore carta digital
int gal1 = 25;  // galleggiante vetri digital
int gal2 = 26;  // galleggiante cruscotti digital
int gal3 = 27;  // galleggiante fascioni digital

const int puls1 = A2;  // pulsante 1 vetri analog
const int puls2 = A3;  // pulsante 2 cruscotto analog
const int puls3 = A4;  // pulsante 3 fascioni analog
const int puls4 = A5;  // pulsante 4 carta analog

int motorcart = 28;  // rele motore carta digital/analog??
int motortagl = 29;  // rele motore taglio carta digital/analog??
int pomp1 = 30;  // rele motore pompa vetri digital/analog??
int pomp2 = 31;  // rele motore pompa cruscotti digital/analog??
int pomp3 = 32;  // rele motore pompa fascioni digital/analog??

int ledV1 = A8;  // led verde 1 vetro analog
int ledV2 = A9;  // led verde 2 cruscotto analog
int ledV3 = A10; // led verde 3 fascioni analog
int ledV4 = A11; // led verde 3 solo carta analog

int ledR1 = A12; // led rosso 1 vetro analog
int ledR2 = A13; // led rosso 2 cruscotto analog
int ledR3 = A14; // led rosso 3 fascioni analog
int ledR4 = A15; // led rosso 4 solo carta analog

//const int motorPin = 22;
//int motorState = LOW;
const int puls1val = 1000;  // pushval = 1000; puls1 = 1000;
const int puls2val = 1000;
const int puls3val = 1000;
const int puls4val = 1000;

//int gettoniera = LOW; bohhhh


void setup() {
  pinMode (getto, INPUT);
  pinMode (inibgetto, INPUT);
  pinMode (sensrot, INPUT);
  pinMode (senscart, INPUT);
  pinMode (gal1, INPUT);
  pinMode (gal2, INPUT);
  pinMode (gal3, INPUT);
  pinMode (puls1, INPUT);
  pinMode (puls2, INPUT);
  pinMode (puls3, INPUT);
  pinMode (puls4, INPUT);
  pinMode (motorcart, OUTPUT);
  pinMode (motortagl, OUTPUT);
  pinMode (pomp1, OUTPUT);
  pinMode (pomp2, OUTPUT);
  pinMode (pomp3, OUTPUT);
  pinMode (ledV1, OUTPUT);
  pinMode (ledV2, OUTPUT);
  pinMode (ledV3, OUTPUT);
  pinMode (ledV4, OUTPUT);
  pinMode (ledR1, OUTPUT);
  pinMode (ledR2, OUTPUT);
  pinMode (ledR3, OUTPUT);
  pinMode (ledR4, OUTPUT);
  Serial.begin(9600);
 //digitalWrite(getto, HIGH);
 digitalWrite(inibgetto, LOW); //disattivo
 digitalWrite(motorcart, HIGH);
 digitalWrite(motortagl, HIGH);
 digitalWrite(sensrot, LOW); // disattivo
 digitalWrite(senscart, LOW); // disattivo
 digitalWrite(gal1, LOW); //disattivo
 digitalWrite(gal2, LOW); //disattivo
 digitalWrite(gal3, LOW); //disattivo
//analogWrite(ledV1, 0);
 
}

void loop()
{
  
  //digitalRead(sensrot);
  //digitalRead(senscart);
   if ((sensrot,LOW)||(senscart,LOW))
   { //"LOW" SEGNALE 0 no tensione
     digitalWrite(inibgetto,HIGH);
     digitalWrite(ledV1,LOW);
     digitalWrite(ledV2,LOW);
     digitalWrite(ledV3,LOW);
     digitalWrite(ledV4,LOW);
     digitalWrite(ledR1,HIGH);
     digitalWrite(ledR2,HIGH);
     digitalWrite(ledR3,HIGH);
     digitalWrite(ledR4,HIGH);
     }
     //digitalRead(gal1);
     else if (gal1,LOW) { //"LOW" SEGNALE 0 no tensione
     digitalWrite(inibgetto,HIGH);
     digitalWrite(ledV1,LOW);
     digitalWrite(ledV2,HIGH);
     digitalWrite(ledV3,HIGH);
     digitalWrite(ledV4,HIGH);
     digitalWrite(ledR1,HIGH);
     digitalWrite(ledR2,LOW);
     digitalWrite(ledR3,LOW);
     digitalWrite(ledR4,LOW);
     }
      else
      //digitalRead(gal2);
      if (gal2,LOW) { //"LOW" SEGNALE 0 no tensione
      digitalWrite(inibgetto,HIGH);
      digitalWrite(ledV1,HIGH);
      digitalWrite(ledV2,LOW);
      digitalWrite(ledV3,HIGH);
      digitalWrite(ledV4,HIGH);
      digitalWrite(ledR1,LOW);
      digitalWrite(ledR2,HIGH);
      digitalWrite(ledR3,LOW);
      digitalWrite(ledR4,LOW);
      }
      else
      //digitalRead(gal3);
      if (gal3,LOW) { //"LOW" SEGNALE 0 no tensione
      digitalWrite(inibgetto,HIGH);
      digitalWrite(ledV1,HIGH);
      digitalWrite(ledV2,HIGH);
      digitalWrite(ledV3,LOW);
      digitalWrite(ledV4,HIGH);
      digitalWrite(ledR1,LOW);
      digitalWrite(ledR2,LOW);
      digitalWrite(ledR3,HIGH);
      digitalWrite(ledR4,LOW);
      }
       //digitalRead(getto);
       //digitalRead(puls1);
       //digitalRead(puls2);
       //digitalRead(puls3);
       //digitalRead(puls4);
       if ((getto,HIGH)&&(puls1,HIGH)&&(senscart,HIGH)&&(sensrot,HIGH)) {
       digitalWrite(motorcart,HIGH);
       delay(2500);
       digitalWrite(pomp1,HIGH);
       delay(600);
       digitalWrite(motortagl,HIGH);
       delay(800);
       }
       else
       if ((getto,HIGH)&&(puls2,HIGH)&&(senscart,HIGH)&&(sensrot,HIGH)) {
       digitalWrite(motorcart,HIGH);
       delay(2500);
       digitalWrite(pomp2,HIGH);
       delay(600);
       digitalWrite(motortagl,HIGH);
       delay(800);
       }
       else
       if ((getto,HIGH)&&(puls3,HIGH)&&(senscart,HIGH)&&(sensrot,HIGH)) {
       digitalWrite(motorcart,HIGH);
       delay(2500);
       digitalWrite(pomp3,HIGH);
       delay(600);
       digitalWrite(motortagl,HIGH);
       delay(800);
       }
       else
       {
        if ((getto,HIGH)&&(puls4,HIGH)&&(senscart,HIGH)&&(sensrot,HIGH)) {
        digitalWrite(motorcart,HIGH);
        delay(2500);
        digitalWrite(motortagl,HIGH);
        delay(800);
       }
       }
   }
[CODE]

Ringrazio anticipatamente chiunque mi fornisca aiuto!!
[/code]

gpb01

#1
Jul 09, 2019, 05:14 pm Last Edit: Jul 09, 2019, 05:15 pm by gpb01
Buonasera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ...

... dopo di che,  ti ricordo che, in conformità al suddetto regolamento, punto 7, devi editare il tuo post qui sopra (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

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell'apposito thread e sistemato il codice come richiesto, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. ;)
Search is Your friend ... or I am Your enemy !

steve-cr

#2
Jul 09, 2019, 08:52 pm Last Edit: Jul 09, 2019, 08:54 pm by steve-cr
Da quello che vedo accendi il motore della carta, aspetti 2,5 secondi poi spruzzi per 0,6 secondi e poi tagli per 0,8 secondi. Per fare ciò usi i delay e andrebbe anche bene perchè usi arduino a step. Però pensavo che spruzzassi intanto che la carta usciva (e in questo caso non puoi farlo con il delay).
Quindi ricordati che il delay ferma il programma e non fa niente altro...
Poi fai dei digitalWrite dei motori con HIGH, ma quando li spegni con LOW?

Dovresti fare un qualcosa così, per esempio:

Code: [Select]

       digitalWrite(motorcart,HIGH);
       delay(2500);
digitalWrite(motorcart,LOW);
       digitalWrite(pomp1,HIGH);
       delay(600);
digitalWrite(pomp1,LOW);
       digitalWrite(motortagl,HIGH);
       delay(800);
digitalWrite(motortagl,LOW);


Stessa cosa nel setup () : accendi dei motori, ma quando li spegni???
Però gli ho dato una guardata veloce e ci saranno anche altre cose che non vanno.
Diciamo che hai "sgrossato" il problema: adesso c'è da perfezionarlo.
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

Maurotec

Quote
// Il sensore OMRON E3F2-DS10C4-N legge la presenza della carta nel vano di spruzzo/strappo e ne blocca il funzionamento fin quando non sia libero ponendo i led di stato in modo e rifiuto monete lampeggiante
Hai descritto molto chiaramente cosa fa la macchina, però mancano alcuni dettagli, ad esempio il sensore presenza carta va alto (HIGH) per segnalare la mancanza o viceversa. Comunque non è un problema al momento in quanto crei delle funzioni che interrogano il sensore e restituiscono un valore true o false, esempio.

Code: [Select]

// valido se il sensore va alto (HIGH) in presenza di carta
boolean cartaIsPresent() {
    return digitalRead(pinSensoreCarta);
}


Se il sensore va basso (LOW) in presenza di carta basta aggiungere un esclamativo per negare.
Code: [Select]

boolean cartaIsPresent() {
    return !digitalRead(pinSensoreCarta);
}

Procederai così creando altre funzioni dal nome non equivocabile per gli altri sensori.

Nel loop la prima cosa che devi controllare è il consenso ad operare abilitando la macchina ad accettare monete, diversamente segnalerai all'utente l'impossibilità di usare la macchina, solitamente se c'è un display su questo viene
visualizzato "Fuori servizio". Se più sensori possono portare la macchina nello stato FUORISERVIZIO allora conviene creare un'altra funzione che interroga tutti i sensori e restituisce true o false, esempio.

Code: [Select]

boolean isFuoriServizio() {
    return (sensore1 & sensore2 & sensore 3)
}

void loop() {
    if (isFuoriServizio() == true) {
         // inserisci qui il codice per disattivare la gettoniera ecc.
         return; // esce dal loop che poi viene richiamato dal core arduino 
    }
    // qui il codice per gestire la macchina quando NON è fuori servizio
}


Ci sono un paio di cose da sistemare che ti possono portare a commettere errori e risultano poco comprensibili a chi ti
vuole aiutare, questo è comprensibile all'inizio ma occorre partire con il piede giusto.

Il tipo di dato byte è grande un byte ovviamente ed è senza segno per cui non puoi rappresentare -1, mentre il tipo int è grande 2 byte (16-bit) ed è con segno per cui puoi rappresentare -1,  -1000 ecc. Quando il valore da assegnare alla variabile non supera 255 ed non serve rappresentare il segno si usa il tipo byte.

Ciao.



torn24

#4
Jul 10, 2019, 10:31 am Last Edit: Jul 10, 2019, 10:38 am by torn24
Ciao! Sto "studiando" da poco le Macchina a stati finiti, è una tecnica di programmazione che si adatta bene ad automatismi, come cancelli automatici, ascensori e distributori automatici :)
La tua macchina è di fatto un distributore automatico, cambia poco se distribuisce bibite o carta umidificata.

La tua macchina si può considerare costituita da più automazioni, il controllo delle monete, e l'erogazione e umidificazione della carta.

Qui un link che spiega in modo semplice come utilizzare una macchina stati finiti con arduino.

http://spectrum.altervista.org/programmazione-stati-finiti/

Tu dovrai crearti due o più funzioni, ognuna delle quali implementa una macchina a stati finiti.

Processo 1 "macchina a stati 1" gestione delle monete.
Processo 2 "macchina a stati 2" erogazione della carta.
Magari una terza macchina per l'umidificazione con diversi prodotti.


Il tuo distributore ha una complessità media, quindi non è il modo più semplice di usare una macchina a stati finiti, Ma tutto si farebbe nel migliore dei modi, e più "professionalmente" :)

Noto anche che nel tuo codice ci sono degli errori di programmazione

     if (gal3,LOW) { //"LOW" SEGNALE 0 no tensione


Dovrebbe essere if(gal3==LOW){

E digitalRead() si usa cosi,  variabile=digitalRead(PIN);

Claudio_FF

#5
Jul 10, 2019, 06:17 pm Last Edit: Jul 11, 2019, 07:13 am by Claudio_FF
Mancano naturalmente tanti dettagli... gettoniera e taglio potrebbero essere intelligenti in se stessi e quindi con un singolo comando di durata opportuna fanno già tutto loro, e questo semplifica la macchina a stati.

Piuttosto i LED li vedrei bene comandati da una macchina a parte, che legge semplicemente in quale fase si trova quella principale.

Un appunto sull'operatività... prima si sceglie e poi si paga, altrimenti sai quanti brillanti che "ma io volevo quell'altra cosa" e premono quella sbagliata o volevano quella su rosso...

Una possibile sequenza mi sembra questa:



In pratica programmata la sequenza delle fasi le altre cose saltano fuori quasi in automatico. La gettoniera è attiva solo in fase 2, il motore carta è attivo in fase 3 e 4, lo spritz solo in fase 4, il motore taglio solo in fase 5... in pratica le fasi rappresentano già le attivazioni.

Restano i LED, che mi sembrano significativi in questo modo: tutti i verdi lampeggianti nella fase 0, accesi fissi a seconda della presenza prodotti nella fase 1, singolo verde lampeggiante per la scelta effettuata nelle fasi da 2 a 5, tutti rossi lampeggianti nella fase 6.

Il comando dei LED può essere affidato a una funzione/processo a parte che in base alla fase li accende nel modo opportuno.
* * * *    'if' e 'case' non sono cicli   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *
* La corrente si misura in 'mA', la quantità di carica in 'mAh' *

ltsrl

Ringrazio tutti per le informazioni che mi avete fornito! cito:Claudio_FF,  torn24,  Maurotec, steve-cr, gpb01.

In questa mia esperienza, intendo realizzare un software semplice ma funzionale, perché dovrò testare i collegamenti, i componenti e i comandi per vedere se tutto funziona. Poi dovrò affinare la tecnica per esempio, per avere lo spruzzo mentre la carta a già iniziato a scendere e si dovrà fermare prima che finisca il foglio... Quindi per chi mi vuole aiutare e assistere, correggo il programma e lo riposto.

E' bellissimo questo forum, immagino che sia colmo di gente come me che ci prova. Perdonatemi se non sono riuscito a trovare un qualcosa che faccia al caso mio, ma non è facile cercare quando sei ignorante come il sottoscritto.
Ancora Grazie.

ltsrl

Quando inserisco la moneta (solo una della taglia giusta) la gettoniera cambia stato da 0 a 1, ma poi torna fissa su 0. Come faccio a prendere/leggere quel segnale e ad utilizzarlo per avviare il ciclo?
In particolare in questa parte del programma:

Code: [Select]

if ((getto==HIGH)&&(puls1==HIGH)&&(senscart=HIGH)&&(sensrot==HIGH)) {


GRAZIE.

ltsrl

#8
Jul 15, 2019, 06:26 pm Last Edit: Jul 15, 2019, 06:28 pm by ltsrl
ho sistemato questo blocco di istruzioni, così dovrebbe andare meglio... La domanda è se MOTORCART E POMP1 vanno insieme??

Code: [Select]

if ((getto==HIGH)&&(puls1==HIGH)&&(senscart=HIGH)&&(sensrot==HIGH)) {
       digitalWrite(motorcart,HIGH);
       delay(200);
       digitalWrite(motorcart,LOW);
       delay(50);
       digitalWrite(motorcart,HIGH);//in questo modo
       digitalWrite(pomp1,HIGH);//vanno in funzione insieme?
       delay(1500);
       digitalWrite(motorcart,LOW);
       digitalWrite(pomp1,LOW);
       delay(50);
       digitalWrite(motorcart,HIGH);
       delay(200);
       digitalWrite(motorcart,LOW);
       delay(100);
       digitalWrite(motortagl,HIGH);
       delay(1000);
       digitalWrite(motortagl,LOW);
       }

Grazie...

Claudio_FF

Si così vanno assieme. ma non serve fare tutti quegli arresta e riparti:
Code: [Select]
digitalWrite(motorcart, HIGH);  // Accende motore carta
delay(200);
digitalWrite(pomp1, HIGH);      // Poi spritz
delay(1500);
digitalWrite(pomp1, LOW);       // Ferma Spritz
delay(200);
digitalWrite(motorcart, LOW);   // Ferma carta
* * * *    'if' e 'case' non sono cicli   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *
* La corrente si misura in 'mA', la quantità di carica in 'mAh' *

ltsrl

Perfetto, come immaginavo - GRAZIE Claudio_FF.
Per altra domanda sopra???
Quando inserisco la moneta (solo una della taglia giusta) la gettoniera cambia stato da 0 a 1, ma poi torna fissa su 0. Come faccio a prendere/leggere quel segnale e ad utilizzarlo per avviare il ciclo?
In particolare in questa parte del programma:

Code: [Select]

if ((getto==HIGH)&&(puls1==HIGH)&&(senscart=HIGH)&&(sensrot==HIGH)) {


GRAZIE.

Claudio_FF

#11
Jul 16, 2019, 07:08 pm Last Edit: Jul 17, 2019, 05:18 pm by Claudio_FF

leggi gettoniera
se HIGH:
    metti a 1 la variabile monetaOK
    
    
se monetaOK E ..quellocheserve...:
   operazioni varie
   rimetti a 0 la variabile monetaOK    
  
  


La variabile 'monetaOK' rimane a 1 anche se l'ingresso torna a zero, quindi nel momento in cui la parte di condizione "..quellocheserve.." diventa vera, le "operazioni varie" vengono eseguite. Naturalmente la lettura gettoniera deve avvenire abbastanza spesso da essere sicuri di catturare l'impulso (che non sappiamo quanto dura). E il poter catturare in tempo l'impulso a sua volta dipende da come è strutturato il resto del programma (non credo che qua si vogliano andare a scomodare gli interrupt).

Se è strutturato come un PLC con un ciclo veloce:
leggi ingressi -> elabora_senza_delay -> scrivi uscite
problemi non ce ne sono.


* * * *    'if' e 'case' non sono cicli   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *
* La corrente si misura in 'mA', la quantità di carica in 'mAh' *

ltsrl

Vi metto tutto così per valutarlo e magari è utile per altri come me....
Attendo vostre opinioni.
Grazie ancora..

Code: [Select]
// Il macchinario, permette l'acquisto di n. 1 panno per la pulizia dell'automobile. Sono disponibili 4 opzioni, di cui 3 umidificate con dei prodotti e 1 asciutto.
// Attraverso un sensore di prossimità posto vicino al rotolo di carta si stabilisce la sua presenza
// I 3 serbatoi sono dotati di galleggiante orizzontale spst x segnalare fine prodotto
// Il sensore OMRON E3F2-DS10C4-N legge la presenza della carta nel vano di spruzzo/strappo e ne blocca il funzionamento fin quando non sia libero ponendo i led di stato in modo e rifiuto monete lampeggiante
// Dopo queste verifiche si restituisce un valore di "stato" ad un led verde o rosso se la carta è disponibile ed i liquidi per le 4 opzioni
// Esempio, prima di introdurre la moneta, se un prodotto è assente, il corrispondente led rosso sopra il pulsante, sarà ON,
// mentre quello verde off.
// Il cliente introduce la moneta nella gettoniera che genera l'input che attiva i 4 tasti di selezione. I led di stato lampeggiano
// Pigiando sul tasto prescelto (del prodotto disponibile), il ciclo per fornire il panno corretto si aziona
// Il motoriduttore aziona i rulli e la carta scorre nel vano di spruzzo/strappo
// Prima che avvenga un eventuale spruzzo e il successivo taglio, il sensore OMRON E3F2-DS10C4-N legge la presenza della carta nel vano di spruzzo/strappo
// Mentre la carta scorre, se è necessrio lo spruzzo, questo si avvia durante lo scorrimento della carta
// Il taglio della carta si aziona quando la carta è arrivata alla lunghezza stabilita
// Il sistema di taglio viene azionato da un motore a tempo.
// La macchina attende imput da gettoniera
// Il cliente ritira il panno prescelto/disponibile.

int getto = 22;  // gettoniera digital
int inibgetto = 33;  // inibizione gettoniera
int sensrot = 23;  // sensore rotolo digital
int senscart = 24;  // sensore carta digital
int gal1 = 25;  // galleggiante vetri digital
int gal2 = 26;  // galleggiante cruscotti digital
int gal3 = 27;  // galleggiante fascioni digital

const int puls1 = 37;  // pulsante 1 vetri analog
const int puls2 = 39;  // pulsante 2 cruscotto analog
const int puls3 = 41;  // pulsante 3 fascioni analog
const int puls4 = 43;  // pulsante 4 carta analog

int motorcart = 28;  // rele motore carta digital/analog??
int motortagl = 29;  // rele motore taglio carta digital/analog??
int pomp1 = 30;  // rele motore pompa vetri digital/analog??
int pomp2 = 31;  // rele motore pompa cruscotti digital/analog??
int pomp3 = 32;  // rele motore pompa fascioni digital/analog??

int ledV1 = A8;  // led verde 1 vetro analog
int ledV2 = A9;  // led verde 2 cruscotto analog
int ledV3 = A10; // led verde 3 fascioni analog
int ledV4 = A11; // led verde 3 solo carta analog

int ledR1 = A12; // led rosso 1 vetro analog
int ledR2 = A13; // led rosso 2 cruscotto analog
int ledR3 = A14; // led rosso 3 fascioni analog
int ledR4 = A15; // led rosso 4 solo carta analog

int puls1val = 0; // E' MEGLIO SENZA VALORE????? tipo LOW
int puls2val = 0;
int puls3val = 0;
int puls4val = 0;  // pushval = 1000; puls1 = 1000; se su pin digitale VALUTARE IL VALORE CON printserial
int monetaok = 0;

void setup() {
  pinMode (getto, INPUT);
  pinMode (inibgetto, INPUT);
  pinMode (sensrot, INPUT);
  pinMode (senscart, INPUT);
  pinMode (gal1, INPUT);
  pinMode (gal2, INPUT);
  pinMode (gal3, INPUT);
  pinMode (puls1, INPUT);
  pinMode (puls2, INPUT);
  pinMode (puls3, INPUT);
  pinMode (puls4, INPUT);
  pinMode (motorcart, OUTPUT);
  pinMode (motortagl, OUTPUT);
  pinMode (pomp1, OUTPUT);
  pinMode (pomp2, OUTPUT);
  pinMode (pomp3, OUTPUT);
  pinMode (ledV1, OUTPUT);
  pinMode (ledV2, OUTPUT);
  pinMode (ledV3, OUTPUT);
  pinMode (ledV4, OUTPUT);
  pinMode (ledR1, OUTPUT);
  pinMode (ledR2, OUTPUT);
  pinMode (ledR3, OUTPUT);
  pinMode (ledR4, OUTPUT);
  Serial.begin(9600);
 
 digitalWrite(inibgetto, LOW); //disattivo
 digitalWrite(sensrot, LOW); // disattivo
 digitalWrite(senscart, LOW); // disattivo
 digitalWrite(gal1, HIGH); //presenza liquido
 digitalWrite(gal2, HIGH); //presenza liquido
 digitalWrite(gal3, HIGH); //presenza liquido
}

void loop()
{
 
   if ((sensrot==LOW)||(senscart==LOW))
   { //"LOW" SEGNALE 0 no tensione
     digitalWrite(inibgetto,HIGH);
     digitalWrite(ledV1,LOW);
     digitalWrite(ledV2,LOW);
     digitalWrite(ledV3,LOW);
     digitalWrite(ledV4,LOW);
     digitalWrite(ledR1,HIGH);
     digitalWrite(ledR2,HIGH);
     digitalWrite(ledR3,HIGH);
     digitalWrite(ledR4,HIGH);
     }
     
     else if (gal1==LOW) { //"LOW" SEGNALE 0 no tensione
     digitalWrite(inibgetto,HIGH);
     digitalWrite(ledV1,LOW);
     digitalWrite(ledV2,HIGH);
     digitalWrite(ledV3,HIGH);
     digitalWrite(ledV4,HIGH);
     digitalWrite(ledR1,HIGH);
     digitalWrite(ledR2,LOW);
     digitalWrite(ledR3,LOW);
     digitalWrite(ledR4,LOW);
     }
      else
     
      if (gal2==LOW) { //"LOW" SEGNALE 0 no tensione
      digitalWrite(inibgetto,HIGH);
      digitalWrite(ledV1,HIGH);
      digitalWrite(ledV2,LOW);
      digitalWrite(ledV3,HIGH);
      digitalWrite(ledV4,HIGH);
      digitalWrite(ledR1,LOW);
      digitalWrite(ledR2,HIGH);
      digitalWrite(ledR3,LOW);
      digitalWrite(ledR4,LOW);
      }
      else
     
      if (gal3==LOW) { //"LOW" SEGNALE 0 no tensione
      digitalWrite(inibgetto,HIGH);
      digitalWrite(ledV1,HIGH);
      digitalWrite(ledV2,HIGH);
      digitalWrite(ledV3,LOW);
      digitalWrite(ledV4,HIGH);
      digitalWrite(ledR1,LOW);
      digitalWrite(ledR2,LOW);
      digitalWrite(ledR3,HIGH);
      digitalWrite(ledR4,LOW);
      }
       monetaok = digitalRead(getto);
       if ((monetaok==HIGH)&&(puls1==HIGH)&&(senscart=HIGH)&&(sensrot==HIGH)) {
       digitalWrite(inibgetto,HIGH);
       digitalWrite(motorcart,HIGH); // Accende motore carta
       delay(200);
       digitalWrite(pomp1,HIGH);// Poi spritz
       delay(1500);
       digitalWrite(pomp1,LOW);// Ferma Spritz
       delay(200);
       digitalWrite(motorcart,LOW);// Ferma carta
       delay(100);
       digitalWrite(motortagl,HIGH);// Accende motore taglio
       delay(1000);
       digitalWrite(motortagl,LOW);// Spenge motore taglio
       digitalWrite(monetaok,LOW);
       digitalWrite(inibgetto,LOW);
       delay(100);
       }
       else
       monetaok = digitalRead(getto);
       if ((monetaok,HIGH)&&(puls2,HIGH)&&(senscart,HIGH)&&(sensrot,HIGH)) {
       digitalWrite(inibgetto,HIGH);
       digitalWrite(motorcart,HIGH); // Accende motore carta
       delay(200);
       digitalWrite(pomp2,HIGH);// Poi spritz
       delay(1500);
       digitalWrite(pomp2,LOW);// Ferma Spritz
       delay(200);
       digitalWrite(motorcart,LOW);// Ferma carta
       delay(100);
       digitalWrite(motortagl,HIGH);// Accende motore taglio
       delay(1000);
       digitalWrite(motortagl,LOW);// Spenge motore taglio
       digitalWrite(monetaok,LOW);
       digitalWrite(inibgetto,LOW);
       delay(100);
       }
       else
       monetaok = digitalRead(getto);
       if ((monetaok,HIGH)&&(puls3,HIGH)&&(senscart,HIGH)&&(sensrot,HIGH)) {
       digitalWrite(motorcart,HIGH); // Accende motore carta
       delay(200);
       digitalWrite(pomp3,HIGH);// Poi spritz
       delay(1500);
       digitalWrite(pomp3,LOW);// Ferma Spritz
       delay(200);
       digitalWrite(motorcart,LOW);// Ferma carta
       delay(100);
       digitalWrite(motortagl,HIGH);// Accende motore taglio
       delay(1000);
       digitalWrite(motortagl,LOW);// Spenge motore taglio
       digitalWrite(monetaok,LOW);
       digitalWrite(inibgetto,LOW);
       delay(100);
       }
       else
       monetaok = digitalRead(getto);       
       if ((monetaok,HIGH)&&(puls4,HIGH)&&(senscart,HIGH)&&(sensrot,HIGH)) {
       digitalWrite(motorcart,HIGH);
       delay(1800);
       digitalWrite(motorcart,LOW);// Ferma carta
       delay(100);
       digitalWrite(motortagl,HIGH);
       delay(1000);
       digitalWrite(motortagl,LOW);// Spenge motore taglio
       digitalWrite(monetaok,LOW);
       digitalWrite(inibgetto,LOW);
       delay(100);
       }
       
   }


Claudio_FF

#13
Jul 20, 2019, 12:47 pm Last Edit: Jul 20, 2019, 04:09 pm by Claudio_FF
Cominciamo con qualche nota iniziale che sennò è troppo lunga...

All'inizio dai dei nomi ai terminali usati (cosa giustissima). Ma qualche volta scrivi int, qualche volta const int. Visto che sono i terminali, il modo corretto è per tutti:const byte

Poi nella funzione setup imposti il modo di funzionamento (INPUT o OUTPUT), e qui iniziano le stranezze, come 'inibgetto' che se non ho capito male è un comando da dare alla gettoniera, quindi deve essere un'uscita di Arduino, non un ingresso.

Poi cerchi di scrivere sugli ingressi.... se sono ingressi vanno letti e non scritti...
Code: [Select]
digitalWrite(sensrot, LOW); // disattivo
digitalWrite(senscart, LOW); // disattivo
digitalWrite(gal1, HIGH); //presenza liquido
digitalWrite(gal2, HIGH); //presenza liquido
digitalWrite(gal3, HIGH); //presenza liquido

Invece non scrivi nessun valore di partenza iniziale sulle vere uscite (motori, pompe, LED), il che vuol dire che probabilmente all'accensione tutte quelle uscite si portano a zero (LOW), e a seconda di come sono effettuati i collegamenti elettrici potresti trovarti con alcune cose che si attivano (quelle comandate con uno zero) e altre ferme (quelle che si attivano con un uno).

Poi proseguiamo: qui non stai leggendo gli ingressi (che si fa con digitalRead o analogRead), ma stai solo confrontando se il numero dei terminali di Arduino è uguale a LOW (cioè zero), il che non è mai vero, e quindi nessuno di quegli if verrà mai eseguito.
Code: [Select]
if ((sensrot==LOW)||(senscart==LOW))

Successivamente usi questa sintassi che già hanno detto essere sbagliata (io non sapevo neppure fosse ammessa):
Code: [Select]
if ((monetaok,HIGH)&&(puls2,HIGH)&&(senscart,HIGH)&&(sensrot,HIGH)) {

Per finire, l'uso della variabile 'monetaok' non è stato del tutto compreso, perché come lo hai scritto è semplicemente il livello letto dall'ingresso 'getto', mentre 'monetaok' deve diventare uno all'inserimento della moneta, e restare a uno anche se il valore letto da 'getto' ritorna a LOW. Si può scrivere in due modi equivalenti, il secondo corrisponde a un relé con autoritenuta:
Code: [Select]
if (digitalRead(getto) == HIGH) { monetaok = 1; }
Code: [Select]
monetaok = (digitalRead(getto) == HIGH) || monetaok;

* * * *    'if' e 'case' non sono cicli   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *
* La corrente si misura in 'mA', la quantità di carica in 'mAh' *

ltsrl

#14
Jul 22, 2019, 07:04 pm Last Edit: Jul 23, 2019, 04:15 pm by ltsrl
Per quanto riguarda l'utilizzo dei comandi per le variabili, ringrazio CLAUDIO_FF e ancor prima Maurotec e mi sono andato a studiare la cosa qui topic=106869.0QUI e QUA.
CLAUDIO_FF è un errore gravissimo quello di scrivere su INGRESSI, me lo sono portato dietro tra copia e incolla, DEVO FARE PIU' ATTENZIONE, soprattutto nei vostri confronti.

Credo ancora di non essere entrato nell'ottica giusta con la variabile "monetaok". Mi è piaciuta molto la riga
Code: [Select]
monetaok = (digitalRead(getto) == HIGH) || monetaok;

ma non credo proprio di aver capito come interpretarla per poterla posizionare all'interno del codice. Sarà corretto metterla nel LOOP? la inserisco nel IF dove ci sta anche il resto?

Grazie.

Go Up