Aiuto per gestire output in mame
Re: Aiuto per gestire output in mame
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);
}
}
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
Rileggi il mio intervento precedente: devo aver editato finché facevi test
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...
Re: Aiuto per gestire output in mame
non ci riesco
aspetto te
![[help2.gif] [help2.gif]](./images/smilies/help2.gif)
![[throw.gif] [throw.gif]](./images/smilies/throw.gif)
![[throw.gif] [throw.gif]](./images/smilies/throw.gif)
![[throw.gif] [throw.gif]](./images/smilies/throw.gif)
![[throw.gif] [throw.gif]](./images/smilies/throw.gif)
![[help2.gif] [help2.gif]](./images/smilies/help2.gif)
![[help2.gif] [help2.gif]](./images/smilies/help2.gif)
Re: Aiuto per gestire output in mame
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);
}
}
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...
Re: Aiuto per gestire output in mame
non succede nulla .
Re: Aiuto per gestire output in mame
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
)
Nota che la funzione timeOut() è da inserire nel loop (perché... Mi sono dimenticato di farlo io

Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...
Re: Aiuto per gestire output in mame
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
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:
e vedi che dice il monitor seriale nelle varie fasi
prova ad inserire una funzione debug semplice, tipo:
Codice: Seleziona tutto
void debug(){
Serial.print("numero gettoni:");
Serial.println(coins);
}
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...
Re: Aiuto per gestire output in mame
(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
ci sono eccolo è giusto ?????
void timeOut(){
if(coins > 0 && millis() - myTimer > TIMEOUT && digitalRead(relePin) == 1){
digitalWrite(relePin ,LOW);
Serial.print("refill");
coins = 0;
}
}
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
non ancora , me lo fa anche a rele spento :(
Re: Aiuto per gestire output in mame
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.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
Confermi?
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...
Re: Aiuto per gestire output in mame
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);
}
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
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
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.
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...
Re: Aiuto per gestire output in mame
Questo è lo sketch fin qui più "sensato"
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.
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);
}
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.
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...
Re: Aiuto per gestire output in mame
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);
}
}
}
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
Dai non ti arrabbiare .... sta funzionando :D :D :D
e in piu ti autorizzo![[spank.gif] [spank.gif]](./images/smilies/spank.gif)
![[flame2.gif] [flame2.gif]](./images/smilies/ukliam2.gif)
![[yahoooooo.gif] [yahoooooo.gif]](./images/smilies/yahoooooo.gif)
![[shake2.gif] [shake2.gif]](./images/smilies/shake2.gif)
![[clap2.gif] [clap2.gif]](./images/smilies/clap2.gif)
![[Laie_73.gif] [Laie_73.gif]](./images/smilies/Laie_73.gif)
e in piu ti autorizzo
![[spank.gif] [spank.gif]](./images/smilies/spank.gif)
Re: Aiuto per gestire output in mame
Non mi arrabbio, ma manco mi ascolti però
Non ha senso scrivere
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.
![[ph34r.GIF.png] [ph34r.GIF.png]](./images/smilies/ph34r.GIF.png)
Non ha senso scrivere
Codice: Seleziona tutto
if(digitalRead(relePin) == HIGH)
Dal ciglio della strada osservo sbraitando i lavori in corso nel mondo arcade...
Re: Aiuto per gestire output in mame
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.
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.