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 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);
}
}
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
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
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 presentartiQUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto ) e di leggere con attenzione il REGOLAMENTO ... Grazie.
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.