interfacciamento con Gettoniera comestero RM5 contamonete

Ma infatti non devi mandare dati di 2 byte !!
Devi mandare 0, un solo byte , poi eventualmente 13, che è il famoso OD.

Non a caso nell'esempio sopra ti avevo messo Serial.write(0).

Tu che hai messo?

P.S. se non compila prova con Serial.write((byte)0)

niki77:
Ma infatti non devi mandare dati di 2 byte !!
Devi mandare 0, un solo byte , poi eventualmente 13, che è il famoso OD.

Non a caso nell'esempio sopra ti avevo messo Serial.write(0).

Tu che hai messo?

P.S. se non compila prova con Serial.write((byte)0)

ti riporto qui sotto il codice scritto sotto tuo consiglio, cosi compila e funziaona :slight_smile: se non altro risponde allo 0, ho lasciato le istruzioni commentate cosi tu possa vedere anche le varianti fatte.
se uso solo l invio dello 0 per farmi rispondere mi risponde con uno 0 e fin qui è fantastico..... GRAZIE
se tento di inviare un 13 che è 1D, prima di tutto devo mettere l'opzione "Carriage Return" su serial monitor altrimenti mi sputa fuori dati a caso senza aspettare l'introduzione della moneta.
comunque sia con CR i dati di risposta sono sempre diverisi
5

FF20

0B0

2D7D

053

FFFFFFFF5

FF1E

0B0

2F7F

050

FFFFFFFF
questi sono 2 introduzioni di moneta da 2 euro i tanti fffff sono la ultima riga scritta dopo l'introduzione della moneta

#include <SoftwareSerial.h>
#include <icrmacros.h>



SoftwareSerial mySerial(6, 7);

int inByte = 0; 
int outByte = 0;
void setup() {
 
  Serial.begin(9600);
  mySerial.begin(9600);

}

void loop() {
  
  // read from port 0, send to port 1:
  if (Serial.available()) {
    int outByte = Serial.read();
    outByte = 0;
  //  Serial.println("comando");
      mySerial.write((byte)0); //comando di inizio comunicazione
     
     
      //mySerial.write(0);

  }
  
  // read from port 1, send to port 0:
 if (mySerial.available()) { //attesa risposta al 0 del serial monitor
 int inByte = mySerial.read();
 Serial.println ( inByte,HEX);
  mySerial.write((byte)13); //comando 1D
   
   
     inByte = mySerial.read();
    
   // Serial.print("Risp. gettoniera");
   // Serial.println ((byte)inByte); 
     //mySerial.write((byte)13);
     Serial.print ( inByte,HEX);
     
     
  }
  
}

hai qualche idea? :~

mi sono accorto che 1D corrispondea a 29 e non 13 ho ricompilato con il nuovo valore e la risposta della gettoniera è comunque sempre diversa ......
=(

[code][quote author=Wonder link=topic=82767.msg624436#msg624436 date=1323888345]
[quote author=niki77 link=topic=82767.msg624310#msg624310 date=1323879992]
Ma infatti non devi mandare dati di 2 byte !!
Devi mandare 0, un solo byte , poi eventualmente 13, che è il famoso OD.

Non a caso nell'esempio sopra ti avevo messo Serial.write(0).

Tu che hai messo?

P.S. se non compila prova con  Serial.write((byte)0)
[/quote]

ti riporto qui sotto il codice scritto sotto tuo consiglio, cosi compila e funziaona :) se non altro risponde allo 0, ho lasciato le istruzioni commentate cosi tu possa vedere anche le varianti fatte.
se uso solo l invio dello 0 per farmi rispondere mi risponde con uno 0 e fin qui è fantastico..... GRAZIE
se tento di inviare un 13 che è 1D, prima di tutto devo mettere l'opzione "Carriage Return" su serial monitor altrimenti mi sputa fuori dati a caso senza aspettare l'introduzione della moneta.
comunque sia con CR i dati di risposta sono sempre diverisi
5

FF20

0B0

2D7D

053

FFFFFFFF5

FF1E

0B0

2F7F

050

FFFFFFFF
questi sono 2 introduzioni di moneta da 2 euro i tanti fffff sono la ultima riga scritta dopo l'introduzione della moneta


[code]
#include <SoftwareSerial.h>
#include <icrmacros.h>



SoftwareSerial mySerial(6, 7);

int inByte = 0; 
int outByte = 0;
void setup() {
 
  Serial.begin(9600);
  mySerial.begin(9600);

}

void loop() {
  
  // read from port 0, send to port 1:
  if (Serial.available()) {
    int outByte = Serial.read();
    outByte = 0;
  //  Serial.println("comando");
      mySerial.write((byte)0); //comando di inizio comunicazione
     
     
      //mySerial.write(0);

  }
  
  // read from port 1, send to port 0:
 if (mySerial.available()) { //attesa risposta al 0 del serial monitor
 int inByte = mySerial.read();
 Serial.println ( inByte,HEX);
  mySerial.write((byte)13); //comando 1D
   
   
     inByte = mySerial.read();
    
   // Serial.print("Risp. gettoniera");
   // Serial.println ((byte)inByte); 
     //mySerial.write((byte)13);
     Serial.print ( inByte,HEX);
     
     
  }
  
}

hai qualche idea? :~
[/quote]

STUPENDO!!!!!
ho risolto il problema di lettura errata, avevo sbagliato la posizione della istruzione che invia 1D
una volta messo uno dietro l'altro senza attendere la risposta, i dati sono coerenti
[/code]
if (Serial.available()) {
int outByte = Serial.read();
outByte = 0;
// Serial.println("comando");
mySerial.write((byte)0); //comando di inizio comunicazione
mySerial.write((byte)29); //comando 1D
[/code]

Voglio ringraziarti niki77 per il supporto, per ora smanetto con quello che ho/abbiamo raggiunto... dovrò sicurmante scomodarti in futuro...
sto molto meglio ora :slight_smile:

Ciao,

HO un altro Problema ma penso che sia una stupidata anche se non riesco a risolverlo...

ho sviluppato il codice mescolando alcuni fatti tra loro e mi sono accorto di questo
quando faccio la lettura da mySerial (vedi asterischi)
dovrei leggere 2 byte di seguito per poi metterli in "inByte" e utilizzarlo per i miei calcoli...
però mi fa uno scherzo, prima mi legge un byte... poi continua il programma e poi torna al leggere il byte restante.
come posso ovviare a quato porblema ?

#include <SoftwareSerial.h>
#include <icrmacros.h>



SoftwareSerial mySerial(6, 7);
int c=0;
int cm = 0;
int cm1 = 0;
int cm2 = 0;
int cm3 = 0;
int cm4 = 0;
int cm5 = 0;
float val1;
float val2;
float val3;
int val4;
int val5;
float somma;
int inByte = 0; 
int outByte = 0;
void setup() {
  val1 = 0;
  val2 = 0;
  val3 = 0;
  val4 = 0;
  val5 = 0;
  somma = 0;
  
  Serial.begin(9600);
  mySerial.begin(9600);

}


void loop() {

  // read from port 0, send to port 1:
  if (Serial.available()) 
  {

    int outByte = Serial.read();
    outByte = 0;
    //  Serial.println("comando");
    mySerial.write((byte)0); //comando di inizio comunicazione
    mySerial.write((byte)29); //comando 1D

    //mySerial.write(0);

  }

  // read from port 1, send to port 0:
  if (mySerial.available()) { //attesa risposta al 0 del serial monitor


*******     int inByte  = mySerial.read(); *********



     Serial.print ( inByte);

delay (10);





    if ( ( inByte) == 1281 ){

      val1 = val1 + 0.1; //somma i vaolri delle monete
      cm1 = cm1++;        //conta il numero di monete per ogni canale

    }




    if ( ( inByte) == 1282 ){ 

      val2 = val2 + 0.2;
      cm2= cm2++;

    }





    if ( ( inByte) == 1285 ){  


      val3 = val3  + 0.5;
      cm3= cm3++;

    }




    if ( ( inByte) == 12810 ){ 

      val4 =  val4 + 1;
      cm4= cm4++;

    }





    if ( ( inByte) == 12820 ){
      //delay (40);
      val5 = val5 + 2;
      cm5= cm5++;

    }

    somma = (val1 + val2 + val3 + val4 + val5);


    Serial.println ("somma");
    Serial.println (somma);
    Serial.println ("Valore per moneta");
    Serial.println (val1);
    Serial.println (val2);
    Serial.println (val3);
    Serial.println (val4);
    Serial.println (val5);
    Serial.println ("n monete per tipo");
    Serial.println (cm1);
    Serial.println (cm2);
    Serial.println (cm3);
    Serial.println (cm4);
    Serial.println (cm5);
  }
}

il codice è un po "sporco" ma tecnicamente funziona con le dovute modifiche

Bravo, vedi che alla fine hai risolto?

a questo punto io invece di usare

if(Serial.available())
{
blocco codice lettura
}

farei un bel:

while(Serial.available())
{
blocco codice lettura
l'iterazione a questo interno continuerà fintanto che ci saranno byte da leggere
}

ovviamente se la lunghezza dei dati da leggere è fissa e la sai prima è più consigliato un ciclo for

if(Serial.available())
{
for(int i = 0 ; i < lunghezzadaleggere ; i++)
{
lettura del byte
}
}

Invece se come ho capito devi solo leggere 2 byte è ancor più semplice:

if(Serial.available())
{
int hn = Serial.read();
int ln = Serial.read();
cosi hai in hn il primo valore ed in ln il secondo
}

Saluti.

Salve Wonder, io volevo autocostruirmi un accettatore di monete e banconote e raggiunto l'importo emette un impulso per chiudere il relè.
Avresti qualche appunto ?
grazie

@Gioiellino: essendo il tuo primo post, ti chiederei di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto :wink:) e di leggere con attenzione il REGOLAMENTO ... Grazie.

Guglielmo

caro Gioiellino

Chiedi a un utente che ha scritto piú di 4 anni fa (Dec 14, 2011, 09:26 pm) per aver aiuto a collegare una gettoniera commerciale per un aiuto a costruirti un congegno che riconosce monete e banconote da te?

Ti dico una cosa: dimenticalo. È una cosa troppo complessa per farlo da te.

Ciao Uwe

Ciao,
nel frattempo qualcosa ho imparato in più e mi ero dimenticato questo post addirittura... sto per rimetterci le mani in questi giorni

saluti