MGuruDC:
Speravo in uno sforzo da parte di chi ha aperto il topic...
Eh... troppo spesso mi sono lamentato anch'io di questa cosa. Vuoi per distrazione, vuoi per caduta d'interesse, vuoi per mancanza di tempo, chi apre un thread poi si scorda di controllarlo e/o di rispondere ai reply.
Beh signori.. io ce l'ho messa tutta ma quella roba a me non serve nemmeno ci ho provato e qualche risultato l'ho avuto ma se l'autore non si applica non posso farci nulla XD
Speravo in uno sforzo da parte di chi ha aperto il topic...
È argomento fondamentale, meglio evitare la solita "pappa pronta"
IO LAVORO E VADO A LETTO PRESTO, SAPETE PERCHE'? PERCHE' IO OGNI GIORNO ALZO UNA TONNELLATA E MEZZA AL GIORNO DI CASSETTE D'UVA. MI DISPIACE SE NON STO TUTTO IL TEMPO SUL COMPUTER A CONTROLLARE LE RISPOSTE SUL FORUM COME VOI, ma ho solo questo momento, la sera, per dedicarmi ai miei hobbie.
Mi dispiace, pensavo che ci fosse gente senza questi inutili pregiudizi
@stefanolavori: non era una critica a te sul fatto che non rispondi spesso, ma verso di noi che ti abbiamo dato il codice già fatto invece che darti dei consigli, lasciarti provare a fare il codice, e se poi ancora non funzionava darti una mano a sistemarlo.
Perchè a trovarsi "la pappa pronta", sopratutto con codice così semplice, si rischia di fare copia-incolla senza capire realmente cosa si sta facendo, e non impari nulla di nuovo.
Per esempio, adesso nella funzione che ti ho scritto, sapresti spiegarmi riga per riga cosa faccio e sopratutto perchè?
Speravo in uno sforzo da parte di chi ha aperto il topic...
È argomento fondamentale, meglio evitare la solita "pappa pronta"
IO LAVORO E VADO A LETTO PRESTO, SAPETE PERCHE'? PERCHE' IO OGNI GIORNO ALZO UNA TONNELLATA E MEZZA AL GIORNO DI CASSETTE D'UVA. MI DISPIACE SE NON STO TUTTO IL TEMPO SUL COMPUTER A CONTROLLARE LE RISPOSTE SUL FORUM COME VOI, ma ho solo questo momento, la sera, per dedicarmi ai miei hobbie.
Mi dispiace, pensavo che ci fosse gente senza questi inutili pregiudizi
Concordo con gli altri era solo per dire che se avessi partecipato in maniera diversa avremmo imparato una cosa nuova dico imparato perchè anche io sono ignorante su questa cosa
E conoscendo gli altri ti posso assicurare ma già l'hanno detto che non erano critiche
Siamo tutti amici qui
Ne ho citato uno per i tre che hanno detto questa cosa.
Devo descrivere una funzione che mi scrivi o una che hai già scritto?
Intanto posso descriverti questa:
int leggiNumero(){ //Apro la funzione dichiarandone un int e il suo nome
char lettera; //Dichiaro una variabile char, di nome lettera
int risultato=0; //Dichiaro una variabile int che inizializzo con 0 di nome risultato
int numeroCifra=0; //Dichiaro un'altra int che inizializzo con 0 di nome numeroCifra
do{ //Uso l'istruzione iterativa (spero si dica così) do - while (fai, se)
lettera = Serial.read(); //Assegno alla variabile lettera il char letto nella Seriale
if (lettera >='0' && lettera <= '9'){ //Uso un'istruzione if il cui contenuto si può tradurre: se lettera è uguale o //////////////////////////////////maggiore di zero e (&&= operatore and) lettera è uguale o minore di 9
risultato = (10*numeroCifra) + lettera-'0'; //Esegui l'operazione: 10 per numeroCifra più lettera meno 0
numeroCifra++; //Incremento rápido di numeroCifre
} //Chiudo l'istruzione if e while
}while (lettera!='\n'); //Uso while ed eseguo l'espressione: se lettera non è uguale a \n ritorno ad
return risultato; // int della funzione leggiNumero il risultato ottenuto
}
Hai creato questa funzione per ottenere un valore corretto (e non con numeri separati o con altre conversioni o casting) da poi stampare sul pin 10 con analogWrite.
Non prendetemi a male, ragazzi, ma mi fa molto fastidio vedere come voi, senza sapere cosa faccio, vi permettete di giudicare una persona.
tranquillo, ora per mezzora ognuno dirà la sua ma vai tranquillo che non muore nessuno
sì intendevo quella funziona. Hai capito perchè l'if non usa 0 e 9 ma '0' e '9', e perchè faccio risultato = (10*numeroCifra) + lettera-'0';?
comuqnue sembra che tu conosca abbastanza bene il C, di solito chi arriva in questo forum non sa nemmeno cos'è un if
Penso di aver capito perchè fai risultato = (10*numeroCifra) + lettera-'0';, penso sia l'espressione algebrica per convertire il numero arrivato ad Arduino nel numero decimale che scriviamo sul monitor seriale.
Secondo me, la differenza tra 0 - 9 e '0' - '9', sia che il primo viene recepito come carattere e quindi da interpretare, mentre il secondo come vero e proprio numero.
Nonostante conosca le basi del c, devo ancora affrontare gli array, i puntatori, enum, struct, socket e una miriade di altre cose. Ed ancora non riesco a comprenderne appieno la logica.
Attenzione, il serial monitor di Arduino non invia il carattere '\n' alla fine della stringa quando si preme "send" e non mi risulta possibile istruirlo in tal senso...
Bisogna usare un altro carattere oppure cambiare metodo.
c'è la spunta "aggiungi new line" o qualcosa del genere
allora se scrivi 0 e 9 hai i numeri, se scrivi '0' e '9' hai i caratteri, cha valgono un numero dettato dalla tabella ascii (eccola: http://www.asciitable.com/, lo '0' è il 48, il '9' il 57)
ahhh ,mi sono accorto di un grosso errore., effettivamente risultato = (10numeroCifra) + lettera-'0'; non ha senso dovrebbe essere risultato = risultato10 + lettera-'0'; ovvero "sposta risultato a sinistra lasciando le unità vuote, e sommaci il valore letto" se fai la prova su un foglio di carta vedi che piano piano, succede
numero 130:
010+1=1
110+3=13
13*10+0=130
dovrebbe essere:
do{ //Uso l'istruzione iterativa (spero si dica così) do - while (fai, se)
lettera = Serial.read(); //Assegno alla variabile lettera il char letto nella Seriale
if (lettera >='0' && lettera <= '9'){ //Uso un'istruzione if il cui contenuto si può tradurre: se lettera è uguale o //////////////////////////////////maggiore di zero e (&&= operatore and) lettera è uguale o minore di 9
risultato = risultato*10 + lettera-'0'; //Esegui l'operazione: 10 per numeroCifra più lettera meno 0
numeroCifra++; //Incremento rápido di numeroCifre
} //Chiudo l'istruzione if e while
}while (lettera!='\n');
Potrei farlo con il NetBeans e Linux con serial.control.
Ho ancora un problema, se può aiutare vi ringrazio.
questo codice e NetBeans, che premono 1,2,3,4,5,6 invierà il valore in esso che clearcut
(Se 0 invia un primer, primer 2 invia 25, premere 3 per 50 e manda gli altri e analizzare)
#include <ctype.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h> /* Standard input/output definitions */
#include <string.h> /* String function definitions */
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */
int vel;
int dir;
char envio[2] = { ' ' } ;
char* status = 0;
int count = 0;
int flags = 0;
int fd, j;
int enviodados;
// abrir porta serie
int abrir_porta_serie(char *port) {
struct termios options;
fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
printf("impossivel a comunicaçao \nligar a porta serial \n", port);
}
else {
tcgetattr(fd, &options); // Get the current options for the port...
cfsetispeed(&options, B9600 ); // Set the baud rates
cfsetospeed(&options, B9600);
options.c_cflag |= (CLOCAL | CREAD); // Enable the receiver and set local mode...
tcsetattr(fd, TCSANOW, &options); // Set the new options for the port...
}
return(fd);
}
// envio de dados
int envio_de_dados(int fd) {
int count;
count = write(fd, envio , strlen(envio));
return(count);
}
int main() {
/* Abrir a porta de dados*/
char port[50] = "/dev/ttyUSB0";
fd = abrir_porta_serie(port);
float opcao;
int weight;
for(;;){
printf("intruduza uma tecla: " );
scanf("%f", &opcao);
if(opcao== 1){
enviodados = 0;
}
else if (opcao == 2){
enviodados = 25;
}
else if (opcao == 3){
enviodados = 50;
}
else if (opcao == 4){
enviodados = 100;
}
else if (opcao == 5){
enviodados = 175;
}
else if (opcao == 6){
enviodados = 225;
}
sprintf( envio, "%d ", enviodados );
printf("dados enviados %s \n ", envio);
//sprintf( direcao, "%dS ", dir );
/*_________________________________________________________________________________________*/
/*inicio dos dados a serem transmitidos*/
envio_de_dados(fd);
weight = envio_de_dados(fd);
}
close(fd);
return 0;
}
il mio problema e il primo dopo la Arduino e il valore che riceviamo è sempre quello di essere trattati e spediti. lui è quello di mantenere in memoria e quando si invia una stampa, perché sempre lo stesso.
Ho usato il codice per leggere il Arduino e le seguenti:
#include <ctype.h>
int recebido;
char dados[4];
int i=0;
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
pinMode(9, OUTPUT);
}
void loop() {
// send data only when you receive data:
if (Serial.available()>4) {
while(isdigit((dados[i++] = Serial.read())));
recebido = atoi(dados);
analogWrite(9,recebido);
Serial.print("dir: ");
Serial.println(recebido);
delay(500);
}
else
{
analogWrite (9, 0);
}
}
l'immagine qui sopra mostra quello che inviare e ricevere.
mando sia nella console Linux, e quello che ottiene è la console serialcomunication Arduino.
cosa ho bisogno per ottenere e rendere i dati variabili aggiornato ogni volta che l'invio di nuovi dati. ajuar se puoi ringraziarmi.
dispiace per il mio italiano, ma non parla italiano e ho usato Google Translate per tradurre.
Lascio qui per vedere il codice, e può aiutare qualcuno
#include <ctype.h>
int recebido;
char dados[4];
int i=0;
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
pinMode(9, OUTPUT);
}
void loop() {
// send data only when you receive data:
if (Serial.available())
{
dados[i] = Serial.read();
if (isdigit(dados[i]))
i++;
else
if (i > 0) // Make sure we have some digits
{
dados[i] = '\0'; // Add null terminator
recebido = atoi(dados);
i = 0;
analogWrite(9,recebido);
Serial.print("dir: ");
Serial.println(recebido);
delay(5);
}
else
{
analogWrite (9, 0);
}
}
}