Pagina 4 di 5

Re: Aiuto per gestire output in mame

Inviato: 13/01/2019, 22:02
da hashmaker
con questo funziona pero una sola volta ^^ però sto per arrivarci non è cosi?

const int optoPin = 8; //questo è il pin a cui è collegato l'optoswitch
const int relePin = 3;
int pin;
int value;
bool optoState; //stato dell'opto
bool lastOptoState; //stato precedente dell'opto
int coins = 0;
int timer;

void setup() {
pinMode(optoPin, INPUT_PULLUP);
pinMode(relePin, OUTPUT);
digitalWrite(relePin, LOW);
Serial.begin(9600); //inizio comunicazione seriale
optoState = digitalRead(optoPin);

}

void loop() {
checkForCredits();
releaseTokens();
tokensCountDown();
tempo();
}

void checkForCredits() {
while (Serial.available() > 0) {
value = Serial.parseInt();
if (Serial.read() == 'x') {
if (value > 0) {
coins ++;
}
}
}
}

void releaseTokens() {
if (coins > 0) {
digitalWrite(relePin, HIGH); //rilascio gettoni
optoState = digitalRead(optoPin);
}
else {
digitalWrite(relePin, LOW); //STOP rilascio gettoni
}

}
void tokensCountDown() {

if (optoState != lastOptoState) { // se lo stato dell'opto è cambiato (cioè qualcosa sta passando, in entrata o uscita)
lastOptoState = optoState;
delay (100); //debounce "economico" (questo serve perchè nel passaggio di stato possono esserci fluttuazioni che portano a conteggi errati)
if (lastOptoState == LOW && coins > 0) {
coins = coins - 1 ; //decremento gettoni
Serial.print("numero gettoni:");
Serial.println(coins);
}
}
}
void tempo() {

if ((optoState != LOW && millis()-timer>5000)) {
lastOptoState = optoState;
digitalWrite(relePin ,LOW);
}
}

Re: Aiuto per gestire output in mame

Inviato: 13/01/2019, 22:11
da Barito
Rileggi il mio intervento precedente: devo aver editato finché facevi test

Re: Aiuto per gestire output in mame

Inviato: 13/01/2019, 22:58
da hashmaker
non ci riesco [throw.gif] [throw.gif] [throw.gif] [throw.gif] aspetto te [help2.gif] [help2.gif]

Re: Aiuto per gestire output in mame

Inviato: 14/01/2019, 9:34
da Barito
Prova questo:

Codice: Seleziona tutto

#define TIMEOUT 5000

const int optoPin = 8; //questo è il pin a cui è collegato l'optoswitch
const int relePin = 3; //questo è il pin a cui è collegato il relè
int pin;
int value;
bool optoState; //stato dell'opto
bool lastOptoState; //stato precedente dell'opto
int coins = 0;
unsigned long myTimer;

void setup(){
pinMode(optoPin, INPUT_PULLUP); //l'opto deve rilevare un segnale...
pinMode(relePin, OUTPUT); //il relè lo riceve.
optoState = digitalRead(optoPin); //inizializzazione stato optoPin
digitalWrite(relePin, LOW);
Serial.begin(9600); //inizio comunicazione seriale
}

void loop(){
checkForCredits(); //ricezione dei crediti da mamehooker
releaseTokens(); //azionamento del relè
tokensCountDown(); //cuntdown del numero di gettoni "fisici" rilasciati
}

void checkForCredits(){
while (Serial.available() > 0) {
pin = Serial.parseInt();
value = Serial.parseInt();
  if (Serial.read() == 'x') {
    if (value > 0){
      coins = coins+1;
    }
  }
}
}

void releaseTokens(){
if(coins>0){digitalWrite(relePin, HIGH);} //rilascio gettoni
else {digitalWrite(relePin, LOW);} //STOP rilascio gettoni
}

void tokensCountDown(){
optoState = digitalRead(optoPin); //aggiorniamo lo stato dell'opto
if (optoState != lastOptoState){// se lo stato dell'opto è cambiato (cioè qualcosa sta passando, in entrata o uscita)
  lastOptoState = optoState;
  delay (40); //debounce "economico" (questo serve perchè nel passaggio di stato possono esserci fluttuazioni che portano a conteggi errati)
    if(lastOptoState == LOW && coins > 0){
       coins = coins-1;   //decremento gettoni
       myTimer = millis(); //"azzero" il timer per timeout
       //Serial.print("numero gettoni:");
       //Serial.println(coins);
    }
}
}

void timeOut(){
  if(coins == 0 && millis() - myTimer > TIMEOUT){
      digitalWrite(relePin ,LOW);
  } 
}


Re: Aiuto per gestire output in mame

Inviato: 14/01/2019, 12:40
da hashmaker
non succede nulla .

Re: Aiuto per gestire output in mame

Inviato: 14/01/2019, 13:00
da Barito
Cioè? Si scassa tutto il codice o semplicemente il motore continua ad erogare come in precedenza?
Nota che la funzione timeOut() è da inserire nel loop (perché... Mi sono dimenticato di farlo io )

Re: Aiuto per gestire output in mame

Inviato: 14/01/2019, 13:11
da hashmaker
ho inserito timeout nel loop ma non succede nulla ( intendo dire che se non passano monete il rele continua su on)

Re: Aiuto per gestire output in mame

Inviato: 14/01/2019, 13:23
da Barito
L'unico motivo che vedo per cui potrebbe restare attivo è che il numero di coins non vada a zero ...

prova ad inserire una funzione debug semplice, tipo:

Codice: Seleziona tutto

void debug(){
Serial.print("numero gettoni:");
Serial.println(coins);
}
e vedi che dice il monitor seriale nelle varie fasi

Re: Aiuto per gestire output in mame

Inviato: 14/01/2019, 13:39
da hashmaker
(edit by barito: scusa, ho editato invece di quotare e non so come richiamare quello che avevi scritto)

Re: Aiuto per gestire output in mame

Inviato: 14/01/2019, 13:46
da hashmaker
ci sono eccolo è giusto ?????

void timeOut(){
if(coins > 0 && millis() - myTimer > TIMEOUT && digitalRead(relePin) == 1){
digitalWrite(relePin ,LOW);
Serial.print("refill");
coins = 0;
}
}

Re: Aiuto per gestire output in mame

Inviato: 14/01/2019, 13:48
da hashmaker
non ancora , me lo fa anche a rele spento :(

Re: Aiuto per gestire output in mame

Inviato: 14/01/2019, 13:55
da Barito
allora appena aggiunto il debug a monitor esce una sfilza di numero gettoni 0 a loop , ho appena dato 1x 1x 1x per emulare 3 monete e a monitor mi esce a loop numero monete 1
ok, dunque all'inizio il numero di coins è zero (lo impostiamo noi infatti), ma se dai crediti, si ferma a "1" e non va a zero, come sospettavo.

Confermi?

Re: Aiuto per gestire output in mame

Inviato: 14/01/2019, 14:10
da hashmaker
non so come spiegartelo . Cioe appena lancio mi esce un loop di numero gettoni = 0 . Se incremento il credito comincia l'erogazione e comincia il countdown e dopo 10 secondi si ferma per refill e torna a numero gettoni 0

con queste modifiche attuali

#define TIMEOUT 10000

const int optoPin = 8; //questo è il pin a cui è collegato l'optoswitch
const int relePin = 3; //questo è il pin a cui è collegato il relè
int pin;
int value;
bool releState = 0;
bool optoState; //stato dell'opto
bool lastOptoState; //stato precedente dell'opto
int coins = 0;
unsigned long myTimer;

void setup(){
pinMode(optoPin, INPUT_PULLUP); //l'opto deve rilevare un segnale...
pinMode(relePin, OUTPUT); //il relè lo riceve.
optoState = digitalRead(optoPin); //inizializzazione stato optoPin
releState = digitalRead(relePin);
digitalWrite(relePin, LOW);
Serial.begin(9600); //inizio comunicazione seriale
}

void loop(){
checkForCredits(); //ricezione dei crediti da mamehooker
releaseTokens(); //azionamento del relè
tokensCountDown(); //cuntdown del numero di gettoni "fisici" rilasciati
timeOut();
debug();

}

void checkForCredits(){
while (Serial.available() > 0) {
pin = Serial.parseInt();
value = Serial.parseInt();
if (Serial.read() == 'x') {
if (value > 0){
coins = coins+1;
}
}
}
}

void releaseTokens(){
if(coins>0){digitalWrite(relePin, HIGH); //rilascio gettoni
releState = 1 ; }
else {digitalWrite(relePin, LOW);} //STOP rilascio gettoni
}

void tokensCountDown(){
optoState = digitalRead(optoPin); //aggiorniamo lo stato dell'opto
if (optoState != lastOptoState){// se lo stato dell'opto è cambiato (cioè qualcosa sta passando, in entrata o uscita)
lastOptoState = optoState;
delay (40); //debounce "economico" (questo serve perchè nel passaggio di stato possono esserci fluttuazioni che portano a conteggi errati)
if(lastOptoState == LOW && coins > 0){
coins = coins-1; //decremento gettoni
myTimer = millis(); //"azzero" il timer per timeout
//Serial.print("numero gettoni:");
//Serial.println(coins);
}
}
}

void timeOut(){
releState = digitalRead(relePin);
optoState = digitalRead(optoPin);
if(releState == HIGH && coins > 0 && millis() - myTimer > TIMEOUT ) {
digitalWrite(relePin ,LOW);
Serial.print("refill");
coins = 0;
releState = 0;
myTimer = millis();
}
}
void debug(){
Serial.print("numero gettoni:");
Serial.println(coins);
}

Re: Aiuto per gestire output in mame

Inviato: 14/01/2019, 14:13
da hashmaker
cioe attualmente questo timer me lo fa anche a rele spento ed e questo che non va bene , dovrebbe farlo solo quando il rele e acceso

Re: Aiuto per gestire output in mame

Inviato: 14/01/2019, 14:18
da Barito
Tu continui a modificare lo sketch accazzo e poi analizzi l'effetto: non puoi procedere così o non vai da nessuna parte. Il relè è un output: non puoi fare lettura di stato! Puoi solo impostare il suo stato.

Re: Aiuto per gestire output in mame

Inviato: 14/01/2019, 14:24
da Barito
Questo è lo sketch fin qui più "sensato"

Codice: Seleziona tutto

#define TIMEOUT 5000

const int optoPin = 8; //questo è il pin a cui è collegato l'optoswitch
const int relePin = 3; //questo è il pin a cui è collegato il relè
int pin;
int value;
bool optoState; //stato dell'opto
bool lastOptoState; //stato precedente dell'opto
int coins = 0;
unsigned long myTimer;

void setup(){
pinMode(optoPin, INPUT_PULLUP); //l'opto deve rilevare un segnale...
pinMode(relePin, OUTPUT); //il relè lo riceve.
optoState = digitalRead(optoPin); //inizializzazione stato optoPin
digitalWrite(relePin, LOW);
Serial.begin(9600); //inizio comunicazione seriale
}

void loop(){
checkForCredits(); //ricezione dei crediti da mamehooker
releaseTokens(); //azionamento del relè
tokensCountDown(); //cuntdown del numero di gettoni "fisici" rilasciati
//timeOut(); //se non passano gettoni da un po', ferma il motore.
//debug();
}

void checkForCredits(){
while (Serial.available() > 0) {
pin = Serial.parseInt();
value = Serial.parseInt();
  if (Serial.read() == 'x') {
    if (value > 0){
      coins = coins+1;
    }
  }
}
}

void releaseTokens(){
if(coins>0){digitalWrite(relePin, HIGH);} //rilascio gettoni
else {digitalWrite(relePin, LOW);} //STOP rilascio gettoni
}

void tokensCountDown(){
optoState = digitalRead(optoPin); //aggiorniamo lo stato dell'opto
if (optoState != lastOptoState){// se lo stato dell'opto è cambiato (cioè qualcosa sta passando, in entrata o uscita)
  lastOptoState = optoState;
  delay (40); //debounce "economico" (questo serve perchè nel passaggio di stato possono esserci fluttuazioni che portano a conteggi errati)
    if(lastOptoState == LOW && coins > 0){
       coins = coins-1;   //decremento gettoni
       myTimer = millis(); //"azzero" il timer per timeout
       //Serial.print("numero gettoni:");
       //Serial.println(coins);
    }
}
}

void timeOut(){
  if(coins == 0 && millis() - myTimer > TIMEOUT){
      digitalWrite(relePin ,LOW);
  } 
}

void debug(){
Serial.print("numero gettoni:");
Serial.println(coins); 
}
La funzione timeOut è disabilitata perchè inutile. Per come è messo ora, timeOut è un hack e complica solo le cose.

Se il motore non si ferma è perchè i gettoni non vanno mai a zero. La funzione releaseTokens() più semplice di così non potrebbe essere: se ci sono zero coins, blocca il rele. Ne cazzi ne mazzi. Controllo che viene eseguito almeno almeno 10 volte al secondo. il relè non si blocca? non hai zeero coins. Il relè si aziona ma il motore non si blocca? Il relè non è adatto al motore.

Re: Aiuto per gestire output in mame

Inviato: 14/01/2019, 15:27
da hashmaker
e io sono cosi :D :D :D in ogni caso ci sono riuscito ... almeno credo .... ossia ho messo un reset (correggimi se sbaglio ) del timer al passaggio delle monete (quindi quando passano le monete il timer non va mai a 0 ) ... di conseguenza quando il timer va a 0 .... fa fermare il rele con il messaggio a seriale refill

const int optoPin = 8; //questo è il pin a cui è collegato l'optoswitch
const int relePin = 3;
int pin;
int value;
bool optoState; //stato dell'opto
bool lastOptoState; //stato precedente dell'opto
int coins = 0;
unsigned long startTime;
#define TIMEOUT 10000

void setup() {
pinMode(optoPin, INPUT_PULLUP);
pinMode(relePin, OUTPUT);
digitalWrite(relePin, LOW);
Serial.begin(9600); //inizio comunicazione seriale
optoState = digitalRead(optoPin);
}

void loop() {
checkForCredits();
releaseTokens();
tokensCountDown();
}

void checkForCredits() {
while (Serial.available() > 0) {
value = Serial.parseInt();
if (Serial.read() == 'x') {
if (value > 0) {
coins ++;
}
}
}
}

void releaseTokens() {
if (coins > 0) {
// Se il motore è fermo, memorizzo il momento in cui parte.
// In questo modo mi assicuro di impostare la variabile solo al fronte di salita di relePin
if(digitalRead(relePin) == LOW){
startTime = millis();
}
digitalWrite(relePin, HIGH); //rilascio gettoni
optoState = digitalRead(optoPin);
}
else {
digitalWrite(relePin, LOW); //STOP rilascio gettoni
}

// Solo se il motore è ancora acceso, dopo 10 secondi dall'attivazione, resetto l'uscita
if(digitalRead(relePin) == HIGH){
if(millis() - startTime > TIMEOUT ){
digitalWrite(relePin, LOW); //STOP rilascio gettoni
Serial.println("refill");
coins = 0;
delay(100);
}
}

}

void tokensCountDown() {
if (optoState != lastOptoState) { // se lo stato dell'opto è cambiato (cioè qualcosa sta passando, in entrata o uscita)
lastOptoState = optoState;
delay (100); //debounce "economico" (questo serve perchè nel passaggio di stato possono esserci fluttuazioni che portano a conteggi errati)
if (lastOptoState == LOW && coins > 0) {
coins = coins - 1 ; //decremento gettoni
startTime = millis(); //reset timer
Serial.print("numero gettoni:");
Serial.println(coins);
}
}
}

Re: Aiuto per gestire output in mame

Inviato: 14/01/2019, 15:30
da hashmaker
Dai non ti arrabbiare .... sta funzionando :D :D :D [flame2.gif] [yahoooooo.gif] [shake2.gif] [clap2.gif] [Laie_73.gif]

e in piu ti autorizzo [spank.gif]

Re: Aiuto per gestire output in mame

Inviato: 14/01/2019, 15:54
da Barito
Non mi arrabbio, ma manco mi ascolti però [ph34r.GIF.png]

Non ha senso scrivere

Codice: Seleziona tutto

if(digitalRead(relePin) == HIGH)
perchè il relèPin è un'uscita! Sei tu che imponi se sia a stato logico alto o basso. Se ti devi chiedere in che stato sia, significa che non hai compreso il codice, e si torna al (primo?) post che ti ho scritto: devi comprendere il codice, riga per riga, se vuoi venirne fuori. Lo stai riempiendo di hack e non è l'approccio giusto. Ad un certo punto ti ritroverai ad aggiungere hack su hack per ovviare ai problemi introdotti dagli hack precedenti.

Re: Aiuto per gestire output in mame

Inviato: 14/01/2019, 17:00
da hashmaker
pero per adesso sta funzionando e anche bene . non si blocca ne si impalla ne nulla .
ora sto pensando di integrare un messaggio di windows ( tipo i messaggi di errore) che mi stampa a desktop quando c'e da fare il refill e quante monete deve ancora erogare.