salve ho aperto un topic pochi giorni fa in merito alla porta serial Porta seriale VisualBasic Arduino - Generale - Arduino Forum e dopo aver seguito i vari consigli del forum mi sono reso conto che forse non è la strada migliore per realizzare il mio obbiettivo, quindi faccio un passo indietro e spiego cosa devo realizzare per essere cosi sicuro di fare la scelta giusta:
ho assemblato e testato un sistema composta da:
3 sonde di temperatura modello DS18B20
3 display sette segmenti che mi rlevano il valore della temperatura
2 led di controllo temperature (1 di allarme - 1 di temperatura corretta)
1 display a 7 segmenti per visualizzare la temperatura di riferimento
1 display a 7 segmenti per il timer di step
il funzionamento dovrebbe essere il seguente
Devo fare arrivare ad arduino una serie di valori (tempo e temperatura)che corrispondo ad un processo suddiviso in due fasi per un massimo di 10 step, ovvero:
1ª Fase massimo 5 step dove gestirà il valore tempo e temperatura per ogni step
questi valori dovranno comparire sui 2 display di riferimento
pausa
azione esterna (pressione di un pulsante)
2ª Fase massimo 5 step dove gestirà solo il valore Tempo che sara diverso da quello dei primi 5 step.
come sopra il valore tempo deve comparire sul display di riferimento.
Percio alla fine per questo lavoro prevedo un massimo di 15 variabili : 10 per la 1ªFase(5 tempo e 5 temperatura) e 5 variabili per la 2ªFase(tempo)
Per ora ho completato i collegamneti hardware e testato i dysplay e le sonde mentre per l'acquisizione dei dati ho realizzato un software visualbasic che appunto permette di inserire tutti i valori pensando di inviarli tramite porta seriale ad arduino.
Secondo voi è la scelta migliore usare un software visualbasic per acquisire i vari valori e poi inviare tutto tramite seriale oppure magari è possibile tramite visualbasic scrivere un file con tuttii valori delle variabili che puo essere acquisito da arduino?
Devo fare arrivare ad arduino una serie di valori (tempo e temperatura)
Presupposto che sensori etc etc siano su arduino...
Vuoi leggere i vari sensori con Arduino, inviare questi dati a Visual Basic, elaborarli e rispedirli ad Arduino ?
Brunello:
io non ho ancora capito cosa vuoi fare..
Devo fare arrivare ad arduino una serie di valori (tempo e temperatura)
Presupposto che sensori etc etc siano su arduino...
Vuoi leggere i vari sensori con Arduino, inviare questi dati a Visual Basic, elaborarli e rispedirli ad Arduino ?
non proprio, vorrei che arduino confrontasse i valori rilevati dai sensori con i valori impostati in visualbasic ed inviati ad arduino, quindi:.
i 3 sensori mi daranno i valori attuali di tre temperature
io imposto dei valori di temperatura di riferimento per ogni termometro(da visual basic invio ad arduino), che arduino interfacciera con i valori reali e mi avviserà quando ci sia una differenza.
il valore di temperatura di 1 termometro dovrà pero essere mantenuto per un lasso di tempo che io imposto:
1° step x1=60(gradi) y2=15 (min)
2° step x2=65 y2=20
3° step x3=0 y3=0
4° step x4=0 y4=0
5° step x5=0 y5=0
in questo caso la fase ha bisogno solo di due step
ci sarebbe una seconda fase ma penso che trovata una soluzione per questo riuscirei ad andare avanti allo stesso modo.
Questi valori, per ora io li imposto tramite visual basic e l'intenzione è quella di inviarli tutti ad arduino e lasciare che li gestisca direttamente senza interfacciarsi piu con il pc , ma non so se è la scelta piu funzionale o sia il caso di configurare il tutto diversamente .
Se ho ben capito, da PC invi ad Arduino una serie di parametri e poi lo lasci indipendente a fare le varie verifiche e/o allarmi.
Direi di condividere la tua idea.
Come suggerimento direi:
devi sviluppare un protocollo con cui inviare i parametri sulla seriale.
valutare di salvare i parametri sulla memoria Eeprom in caso di caduta di alimentazione.
forse troppo lusso! Avere la possibilità di modificare i parametri direttamente da Arduino con un keypad
mi hai capito benissimo
e penso che l'idea del "lusso" direi che è a dirpico sensazionale. per il protocollo che invia dati ad Arduino penso che ti riferisca al software che da PC trasmette i dati e che io per ora ho fatto in visuale BASIC. giusto? anche se cmq ancora non ho capito bene come fare. facendo un passo alla volta penso che si possa arrivare anche al . grazie delle idee. attendo qualche suggerimento su come proseguire
Be! la prima cosa, basilare, è realizzare il software che gira su Arduino e i vari parametri li definsci direttamente sullo sketch.
Così prendi confidenza con sua la programmazione e vedi se tutto funziona secondo le tue aspettative.
All'interno del software i parametri invece di scriverli in modo diretto "if (valtemp1 > 23)...." , li passi sottoforma di variabili "if (valtemp1 > tempmax1)....", in modo tale che successivamente tramite la seriale andrai a modificare tale variabile.
Poi l'aspetto di trasferire i parametri via seriale non è un problema complesso. Prendi spunto dai vari post, in quanto è un argomento che viene sempre trattato.
OK....avevo già scritto il codice di Arduino per provare appunto l'effettivo funzionamento dei sensori usando dei valori fissi di riferimento e tutto funziona. la mia difficoltà pero è quella di trasferire tramite seriale questi valori e anche provando a leggere diversi post non capisco come poter inviare questa serie di dati facendoli poi interpretare ad Arduino. Penso che la cosa migliore sia quella di, una volta acquisiti tutti i dati con il software, inviarli con un unico passaggio e poi far scomporre i dati direttamente dal codice Arduino.
I modi per inviarli sono infiniti, dipende dalla fantasia.
Una interfaccia I/O che ho utilizzato proprio con VB, richiedeva un protocollo molto semplice e sopratutto alfanumerico.
In questo modo potevi inviare i comandi anche tramite un emulatore di terminale tipo Hyperteminal.
Il pacchetto tipo: "*A8243" + cr
"*" era una sorta di header del pacchetto.
"A" era l'etichetta del comando e ovviamente sei libero nella scelta.
"8243" erano 2 byte in formato esadecimale
"cr" (13) fungeva da fine pacchetto
Se scegli questa modalità, il software è piuttosto semplice:
carichi i byte in arrivo su char[ ]
verifichi presenza header e cr
interpreti il comando 'A' o altro ( B, C, D, ecc.)
calcoli il valore dei byte
a voler far le cose serie potresti restituire una stringa "OK" +cr+lf (vedi modem AT)
lelebum:
I modi per inviarli sono infiniti, dipende dalla fantasia.
Una interfaccia I/O che ho utilizzato proprio con VB, richiedeva un protocollo molto semplice e sopratutto alfanumerico.
In questo modo potevi inviare i comandi anche tramite un emulatore di terminale tipo Hyperteminal.
Il pacchetto tipo: "*A8243" + cr
"*" era una sorta di header del pacchetto.
"A" era l'etichetta del comando e ovviamente sei libero nella scelta.
"8243" erano 2 byte in formato esadecimale
"cr" (13) fungeva da fine pacchetto
Se scegli questa modalità, il software è piuttosto semplice:
carichi i byte in arrivo su char[ ]
verifichi presenza header e cr
interpreti il comando 'A' o altro ( B, C, D, ecc.)
calcoli il valore dei byte
a voler far le cose serie potresti restituire una stringa "OK" +cr+lf (vedi modem AT)
E il gioco è fatto
premetto di non avere tanta dimestichezza con la programmazione da poter realizzare quanto hai spiegato ma credo di aver capito il significato di * e di A e cr e. di come potrei utilizzarlo: lato visuale BASIC dovrei creare una pacchetto tipo *A16945A27545A300A400A500cr cioè la prima fase e composta da 2 step il primo a 69° per 45 min poi 2° step 75° per 45 min e il resto sono step non utilizzati. se cosi fosse lo stesso posso fare con la seconda fase sostituendo la lettera A con B. È giusto fino a qui?
hrazie
Da quello che ho capito mandi una serie di sequenze temperatura-tempo, definite da due coppie di byte.
Se è confermato allora puoi elminare sia 'A' perchè inutile nel tuo caso, come anche l'indice dello step "1 2 3 ecc".
Giusto per farti capire il concetto, anche '*' e 'cr' essendo non funzionali al tuo software, potrebbero essere eliminati.
Servono sopratutto ad identificare in fase di ricezione del pacchetto la testa e la coda dello stesso.
Trattandosi di una sequenza di numeri, dovrai pure in qualche modo essere sicuro di aver ricevuto il pacchetto completo e non un frammento.
OK ho capito il concetto.... partendo dal pacchetto di visual basic quindi posso creare una variabile che contenga al suo interno * tutti gli step di temperatura e tempo e CH finale.? questa dovrà essere di tipo string in visual BASIC?
questa dovrà essere di tipo string in visual BASIC?
Chiaro che sì!
In VB, prima andrai a comporre la tua stringa con le varie sequenze, poi alla fine aggiungerai il carattere iniziale "" e il cr (13) finale.
Lato Arduino dovrai fare un lavoro inverso. Resti in attesa del carattere "", dopo di che andrai a caricare nel tuo buffer tutti i successivi caratteri in arrivo.
Una volta ricevuto il carattere cr hai la certezza che il pacchetto è completo e dovrai interagire con il tuo software.
Come step successivo, ma solo quando tutto funziona a dovere, non sarebbe male aggiungere al pacchetto un carattere di check-sum, giusto per aumentare la sicurezza della tramissione.
ok ......lato visual basic non ho difficolta a creare la stringa e per inviarla uso il comando Serialport1.Write(Stringafinale) mentre non mi è chiaro lato arduino come procedere praticamente anche se adesso ho capito in che modo lavora lo scetch....
Più sarà semplice l'interfaccia di ingresso/uscita realizzata con arduino deleganto tutta l'intelligenza sul PC e meglio andrà il sistema, puoi distinguere 4 classi di instruzione che il PC tramite VB invierà all'interfaccia:
-lettura ingressi digitali
-scrittura uscite digitali
-lettura ingressi analogici
-scrittura uscite analogiche
se ti và di studiare il protocollo MODBUS su rs232 o RS485 ti renderai conto che è già fatto e se aderirai a questo standard fatto 30 anni fa potrai collegari non solo arduino al PC ma qualsiasi interfaccia MODBUS
icio:
Più sarà semplice l'interfaccia di ingresso/uscita realizzata con arduino deleganto tutta l'intelligenza sul PC e meglio andrà il sistema, puoi distinguere 4 classi di instruzione che il PC tramite VB invierà all'interfaccia:
-lettura ingressi digitali
-scrittura uscite digitali
-lettura ingressi analogici
-scrittura uscite analogiche
se ti và di studiare il protocollo MODBUS su rs232 o RS485 ti renderai conto che è già fatto e se aderirai a questo standard fatto 30 anni fa potrai collegari non solo arduino al PC ma qualsiasi interfaccia MODBUS
la mia intenzione, non so quanto fattibile dopo aver letto la tua risposta , è quella di impostare una serie di valori tramite visual basic e "spedirli" in un unica stringa ad Arduino che in base alla sequenza li assegnerà a delle variabili specifiche all'interno del codice, interagendo quindi con i sensori, allarmi, ecc. Perciò il software visual basic dovrà essere solo da settaggio per alcune variabili del codice Arduino che gestirà tutto l'insieme del "pannello finale" (display a 7 segmenti per le temperature, sensori......) funzionando in modo del tutto indipendente dal PC.....
Voglio pero premettere di non avere grandi esperienze di programmazione e la scelta di visual basic come base per la creazione di un software di "impostazione per Arduino" è nata solo per caso, ed anche se fino ad'ora riesco a "soddisfare" le mie intenzioni di progetto finale, non sono sicuro se questa scelta sia la più conveniente in termini tecnici.
questa dovrà essere di tipo string in visual BASIC?
Chiaro che sì!
In VB, prima andrai a comporre la tua stringa con le varie sequenze, poi alla fine aggiungerai il carattere iniziale "" e il cr (13) finale.
Lato Arduino dovrai fare un lavoro inverso. Resti in attesa del carattere "", dopo di che andrai a caricare nel tuo buffer tutti i successivi caratteri in arrivo.
Una volta ricevuto il carattere cr hai la certezza che il pacchetto è completo e dovrai interagire con il tuo software.
Come step successivo, ma solo quando tutto funziona a dovere, non sarebbe male aggiungere al pacchetto un carattere di check-sum, giusto per aumentare la sicurezza della tramissione.
sto cercando di scrivere in arduino il codice per ricevere la stringa ma non funziona
questo è quello che ho usato
int stringa [16];
char x=stringa[1];
void setup ()
{
pinMode(8, OUTPUT);
Serial.begin (9600);
}
void loop () {
for (int i = 0; i <17; i++) {
Serial.print(stringa[i]);
delay (50);
if (x=2){
digitalWrite(8, HIGH);
}
}
}
ma in visual basic ho associato la scrittura sulla porta seriale al click di un bottone.Va bene in questo modo oppure la scrittura deve essere fatta in modo continuo usando per esempio un timer?
nikola291:
Voglio pero premettere di non avere grandi esperienze di programmazione e la scelta di visual basic come base per la creazione di un software di "impostazione per Arduino" è nata solo per caso, ed anche se fino ad'ora riesco a "soddisfare" le mie intenzioni di progetto finale, non sono sicuro se questa scelta sia la più conveniente in termini tecnici.
VB una volta era snobbato dai programmatori professionisti ma oggi và più che bene per qualsiasi applicazione
nikola291:
Voglio pero premettere di non avere grandi esperienze di programmazione e la scelta di visual basic come base per la creazione di un software di "impostazione per Arduino" è nata solo per caso, ed anche se fino ad'ora riesco a "soddisfare" le mie intenzioni di progetto finale, non sono sicuro se questa scelta sia la più conveniente in termini tecnici.
VB una volta era snobbato dai programmatori professionisti ma oggi và più che bene per qualsiasi applicazione
quindi premesso che la stringa che ho creato vadi bene come si usa un array in Arduino per poterla leggere?. Ho provato a cercare nel forum e quello che ho capito mi ha fatto scrivere la porzione di codice che ho riportato prima mq non funziona
Premetto che non ho molta esperienza in merito di trasferimenti e il codice che ho allegato è frutto
di una serie di post che ho trovato in questo forum.
Il codice non l'ho ancora testato, ma per come l'ho messo insieme confido che non dovrebbe darti problemi
Gradito un tuo riscontro se tutto ha funzionato.
int flag; // abilita trasferimento caratteri al buffer
int counter; // numero caratteri in buffer
const byte countermax = 50; // massimo n. di caratteri accettato
byte buffer [countermax]; // buffer per caratteri da seriale
byte car; // carattere in ricezione
void setup() {
Serial.begin(9600);
flag = 0; // attende header pacchetto
counter = 0; // resetta contatore caratteri nel buffer
}
void loop() {
if (Serial.available()) rxcom(); // se ci sono caratteri disponibili
// richiama la routine di ricezione pacchetto
}
void rxcom(){
car = Serial.read(); // legge carattere dal seriale
if (car == '*') { // header pacchetto
flag = 1; // abilita trasferimento caratteri al buffer
counter = 0; // resetta contatore caratteri nel buffer
return;
}
if (flag) { // è stato riconosciuto l'header del pacchetto
buffer [counter] = car; // carica car nel buffer
if (counter < countermax) counter ++; // testa fine buffer incrementa conteggio
if (car == 13) { // fine record
// ... Qui devi inserire il software
// ... che interpreterà il pacchetto
// ...
// ... AL termine di tale software
// ... dovrai inserire la riga
// ... flag=0;
// ... per disabilitare il trasferimento al buffer
// ... Opzionale aggiungere anche la riga
// ... Serial.print("OK");
// ... per informare il PC che tutto è andato a buon fine
// ... e Arduino è pronto a ricevere un nuovo pacchetto
}// if (car==13)
} // if (flag)
return;
} // void RxCom
Questo codice non lo devi vedere come soluzione finale, ma come una semplice bozza sul trasferimento di dati.