Show Posts
Pages: [1] 2
1  International / Software / Re: read serial problemi + proposta mini paginetta su arduino.cc on: January 09, 2013, 12:15:28 pm
m_ri ha ragione, la domanda di leggere stringhe da seriale compare almeno 2 o 3 volte alla settimana

Ciao Lesto, appunto per questo sarebbe utile inserire nella demo-repository standard degli sketch di Arduino un tutorial con codice commentato sulla ricomposizione di quanto arriva dalla seriale. Che poi sia con array, string o altro fa niente, basta contemplarlo nei commenti...

Anche perché è più facile imparare copiando che inventando (anche se dipende molto dai motivi per cui uno si interessa di Arduino...)

Ciao, Salvatore
2  International / Software / Acquisire e ricomporre un numero da seriale on: January 08, 2013, 08:09:08 am
Devo acquisire un valore numerico con range 0-9999 dalla seriale, la quale ovviamente riceve un char per volta.
Ho provato a fare così

Code:

#define led 12  // led connesso al pin n°12

void setup()
{
Serial.begin(9600); // imposto la UART per lavorare a 9600
pinMode(led, OUTPUT); // imposto il pin sul quale è collegato il led come uscita
Serial.flush(); // svuoto il buffer di ricezione seriale
}
 
void loop() {
if (Serial.available() >0) { // Controllo se il buffer di ricezione contiene qualcosa
          int value = leggiSeriale();
               }
            }
             
  int leggiSeriale() {
                  char buffer[4];
                  int value = 0;
                  int index = 0;
                  int moltiplicatore = 1;
                 
                  while (Serial.available() > 0) {
                    buffer[index] = Serial.read();
                    index++;
                  }
                  while(index >= 0) {
                    value = value + moltiplicatore*buffer[index];
                    index--;
                    moltiplicatore = moltiplicatore*10;
                  }
                  return value;
                }

                if (value>'5') // se ho ricevuto un valore maggiore di 5

{
digitalWrite(led,HIGH); // accendo il led
Serial.println("Led Acceso"); //e stampo a video lo stato del led
}
 
else // se invece
 
if value<'4') // ho ricevuto un valore inferiore a 5

{
digitalWrite(led,LOW); // spengo il led
Serial.println("Led spento"); //e stampo a video lo stato del led
}
             }


ma il debug mi da errori aspettandosi una dichiarazione prima dell'if...

Ciao, Salvatore
3  International / Hardware / Re: Pilotare delle resistenze in funzione della produzione FV on: December 20, 2012, 11:51:02 am
azz... è proprio tempo di compiti a casa...  smiley-grin
Ok, torno online quando ho qualcosa da correggere...
/*(anche se, a dir la verità non riesco a capire la sintassi dell'esempio * istruzione #  ma domani mi ci dedico...*/

ciao
4  International / Hardware / Re: Pilotare delle resistenze in funzione della produzione FV on: December 20, 2012, 07:58:05 am
rispondo quì.

Code:
char dir_in[100] = "E:\\Steve\\Personale\\Data\\";

già quà qualcosa non mi torna. questo è un path windows, non unix...


Si Lesto, in effetti sono abbastanza multipiattaforma, visto che normalmente uso mac, in ufficio winxp, per diletto (poco) linux. In particolare poi ho un minipc (model Pogoplug riadattato) con ArchLinux come datalog per l'impianto FV.
Il sorgente che hai visto è stato scritto su winxp, di qui il path...


/edit
perché non usare stream .read()  o leggere i char come arrais e convertirli?
Forse ho detto una castroneria....eh?
Quote
poi sarà che mi perdo tra l'identazione "a cazzum" e le verie righe commentate, ma non mi pare di vedere nulla che scrive sulla seriale...
Si, in effetti l'indentazione è parzialmente alla cdc, a causa dei continui pasticci/tentativi di far girare il pezzo...

Quote
MA stiamo divagando, quello NON è il tuo problema, sarebbe bello avere l'errore di compilazione
Beh, non ho ancora un vero messaggio di errore in debug, nel senso che sto cercando di capire la corretta sintassi...

Quote
..... due parti, ed è sensibile agli errori (perdita di un byte)
Su questo torno dopo che ho studiato quanto hai scritto  smiley-eek-blue

Per ora many thanks

Salva
5  International / Hardware / Re: Pilotare delle resistenze in funzione della produzione FV on: December 20, 2012, 05:02:53 am
Grazie Mauro, quando torno a casa lo provo. Purtroppo dall'ufficio ultimamente non riesco ad entrare nella mia lan domestica con ssh. Si deve essere bloccato qualche servizio sul router o sul minipc nel quale sta girando ArchLinux (è un data logger di un impianto fotovoltaico...).
Ovviamente si intende che il sorgente che hai postato è lato pc, non lato Arduino, a scanso di equivoci... smiley

sm
6  International / Hardware / Re: Pilotare delle resistenze in funzione della produzione FV on: December 20, 2012, 03:37:46 am
Ciao Mauro,

grazie per la risposta, ma il problema di questo sorgente è che non riesco a trovare l'istruzione corretta per inviare il dato sulla seriale usb.

(dopo di che avrò il problema di compilare il sorgente in C per la distro ArchLinux, ma questo, a parte il corretto individuare la porta seriale, non credo che sia un problema... )

e, lato Arduino, ricomporre l'array di caratteri per passarli come numero intero di più cifre e non come singoli char...

Ciao, Salvatore

7  International / Hardware / Re: Pilotare delle resistenze in funzione della produzione FV on: December 19, 2012, 11:38:34 am
Per Leo72 e Lesto

/* breve ot (ma non troppo fuori dal seminato):

il seguente sorgente, in C, legge un valore numerico da un file .csv, compreso tra 1 e 4500.
Non riesco a compilare la parte che mi fa il print sulla seriale usb del minipc nel quale gira Arch Linux...
Tra l'altro poi Arduino mi deve leggere il valore per intero e non come sequenza dei valori dei caratteri...

Ciao, Salvatore

fine ot */

Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <cstdio.h> // libreria per il print su serial port

//=============

int mtomm (char *month);

//............

char dir_in[100] = "E:\\Steve\\Personale\\Data\\";
char nome_file[200];
char riga[200];
char tempo_attuale[20];

int i, col;

float valore;

char car;

char data[9], ora[5];

int gg, mm, aa;
int hh, min, sec;

const int TEST = 1;

int main ()
{

FILE *fdata;

// 1 open file data
sprintf(nome_file,"%s20121116.csv", dir_in);
//printf("\nTEST \nfile personale \n%s \n", nome_file);

if (TEST == 1)
    {
    printf("\n****\n\ntest mode start\n\n****\n\n");

    printf("The current filename is: %s\n\n", nome_file);

     };

fdata=fopen(nome_file,"r");
if (fdata==NULL) { printf("\n ***** Nome file dati non valido \n %s \n", nome_file); exit(0); };


//printf("\n TEST LETTURA FILE PERSONALE \n");
//sprintf(nome_file,"%s_personale_letto.txt", dir_out);
//fc=fopen(nome_file,"w");
//if (fc==NULL) { printf("\n ***** Nome file letto personale non valido \n %s \n", nome_file); exit(0); };

time_t rawtime;

if (TEST == 1)
    {

    printf("The current rawtime is: %d\n\n", rawtime);

    fscanf(fdata, "%s", riga);

    printf("line one of file %s \n %s\n", nome_file, riga);
    };


i=0;

while( !feof(fdata) ) {

    fscanf(fdata, "%s", riga);

    i++;

    }


if (TEST == 1)
    {
    printf("riga :  %d\n%s\n\n", i, riga);

    printf("colonna : %d\n%f\n\n", col, valore);

    };


if (TEST == 1)
    {
    printf("prima di sscanf\n");
    printf("riga :  %d\ncontenuto riga :%s\n\n", i, riga);

//    printf("colonna : %d\n%f\n\n", col, valore);

    };


for (col=1; col<11; col++)
    {

    if (TEST == 1)
        {

        printf("\ncol : %d riga: %s\n\n", col, riga);

//        printf("valore :  %f\t", valore);

        };

    sscanf(riga, "%[^','],%s,%[^','],%s",  nome_file, riga);
    };

valore = atof(nome_file);

if (TEST == 1)
    {

    printf("dopo sscanf\nriga :  %d\ncontenuto riga : %s\ncontenuto nome_file : %s\n\n", i, riga, nome_file);

    printf("valore :  %f\t", valore);

    };


fclose(fdata);
//serial.print (valore) /dev/tty.usbmodem1d11  //stampa invia il valore &d su seriale

if (TEST == 1)
    {
    printf("\n****\n\ntest mode ended\n\n****\n\n");

    };

//system("PAUSE");
return 0;
}
8  International / Software / Re: If o non if , it is the problem... on: December 14, 2012, 05:07:12 am
Sono molto newbbie in questo forum (o meglio, proprio su tutta la materia...) ma qui si spacca il byte in otto!
E d'altronde se così non fosse sarebbe (infatti "è") facile sbagliare per una virgola mal posta...

Ed ecco il codice funzionante "quasi" bene...

Dico quasi perché c'è qualcosa forse nella dichiarazione iniziale "int", o non so cosa, che fa passare solo i valori ad una cifra (da 0 a 9), per cui il valore 982 viene passato come 9, poi come 8 e quindi come 2. Ovviamente in questo caso il led rimane spento perché l'ultimo valore è <2…
mah…

Ciao, sm


Code:
/* accendere o spegnere un led in funzione del valore ricevuto sulla seriale */

#define led 13  // led connesso al pin n°13
int rx = 0;    // variabile per contenere il carattere ricevuto

void setup()
{
Serial.begin(9600); // imposto la UART per lavorare a 9600
pinMode(led, OUTPUT); // imposto il pin sul quale è collegato il led come uscita
Serial.flush(); // svuoto il buffer di ricezione seriale
}

void loop()
{

if (Serial.available() >0) // Controllo se il buffer di ricezione contiene qualcosa
{
rx = Serial.read(); // leggo il carattere ricevuto e lo memorizzo in rx
Serial.flush(); // svuoto il buffer di ricezione seriale

if (rx>'5') // se ho ricevuto un valore maggiore di 5

{
digitalWrite(led,HIGH); // accendo il led
Serial.println("Led Acceso"); e stampo a video lo stato del led
}

else // se invece

if (rx<'4') // ho ricevuto un valore inferiore a 5

{
digitalWrite(led,LOW); // spengo il led
Serial.println("Led spento"); e stampo a video lo stato del led
}

}
}
9  International / Software / Re: If o non if , it is the problem... on: December 13, 2012, 11:04:04 am
Risolto, grazie.

Ora passo allo studio di Case...
10  International / Software / Re: If o non if , it is the problem... on: December 13, 2012, 08:25:17 am
Scusate, forse sono stato sintetico o poco chiaro.
Il codice di cui sopra non mi presenta errori formali al debug di verifica del compilatore Arduino.
Ma quando lo carico se digito un valore >5 sul monitor della seriale del programma Arduino il led si accende (corretto), ma se dopo digito un valore <5, per es. 2, il led non si spegne.
Perché?
La sintassi degli if sembra corretta...

Da cosa è stato sostituito Serial.flush ?

Spero di essere stato più chiaro  smiley-confuse
11  International / Software / If o non if , it is the problem... on: December 13, 2012, 07:09:48 am
All'interno di un progettino per pilotare delle resistenze elettriche per il riscaldamento mi si pone il seguente problema:
voglio che quando sulla seriale arriva un valore >5 il led (il pin digitale) sia alimentato, quando inferiore invece sia spento.
Però con questo codice funziona solo il primo if... dove sbaglio?
(la questione è talmente banale che non sto neppure a dire che sono pre-beginner...)
Più avanti le cose si complicheranno perché devo gestire 4 stati per diverse resistenze, ma credo che utilizzerò l'istruzione Switch.
Grazie per chi avrà la pazienza di aiutarmi

Ciao, Salvatore

 
#define led 13  // led connesso al pin n°13
int rx = 0;    // variabile per contenere il carattere ricevuto
 
void setup()
   {
   Serial.begin(9600); // imposto la UART per lavorare a 9600
   pinMode(led, OUTPUT); // imposto il pin sul quale è collegato il led come uscita
   Serial.flush(); // svuoto il buffer di ricezione seriale
   }
 
void loop()
     {
           if (Serial.available() >0) // Controllo se il buffer di ricezione contiene qualcosa
         {
         rx = Serial.read(); // leggo il carattere ricevuto e lo memorizzo in rx
         Serial.flush(); // svuoto il buffer di ricezione seriale
              if (rx>5) // ho ricevuto un valore maggiore di 5
          {
                    digitalWrite(led,HIGH); // accendo il led
          }
               
        if (rx<4) // il valore è inferiore a 4
          {            
          digitalWrite(led,LOW); // spengo il led
          Serial.println("Led spento");
                    }
         }
          }
12  International / Hardware / Re: Pilotare delle resistenze in funzione della produzione FV on: November 16, 2012, 03:28:43 am
... (a proposito, credo tu ti riferisca alla distribuzione ArchLinux, non mi pare ne esista una che si chiama ArchiLinux) ...

Ahi ahi, qui siamo precisi, eh? Subito matita rossoblu!  smiley-lol
Si, l'osservazione è giusta, tra l'altro stavamo scrivendo in contemporanea  smiley

link a progetti (o parte di essi)?

Ciao
13  International / Hardware / Re: Pilotare delle resistenze in funzione della produzione FV on: November 16, 2012, 03:23:03 am
@Uwe: ho un impianto fotovoltaico sul tetto da 4,2 Kw, due stringhe, un inverter, regime di scambio sul posto.
Quindi la corrente che uso è alternata 220 v, la normale corrente di rete monofase fornita da Enel.

Preciso meglio lo stato del progetto.

Lato Arduino:
- il programma sarà compilato in modo che la porta seriale usb stia sempre in ascolto, quando legge valore "x" attiva il relè "A", quando arriva il valore "y" eccita il relè "B", al valore "z" li attiva tutte e due, quando legge il valore "0" non attiva nessun relè.
E questa credo che sia la parte più semplice del programma. Di sicuro trovo progetti all'interno dei quali è già descritta parte di questa procedura. Ma siccome non conosco ancora il C, vi sono grato se mi li indicate, almeno dove, in quale repository andare a cercare...

- Per la seconda parte del progetto credo che invece la salita si faccia un po' più dura (almeno per me).
Infatti intendo monitorare le fasi attacco/stacco delle resistenze/relè, con la finalità di gestirle in modo economicamente conveniente, e creare così i presupposti di un algoritmo un po' complesso, che tenga conto di diverse variabili, quali curva di rendimento del processo al variare dell'insolazione, convenienza economica dei diversi sistemi di riscaldamento, ecc... Ma procediamo step by step e poniamo il primo traguardo:
a. creare un datalog in files testo col tempo/orari di accensione dei singoli relè/resistenze.
Per questo si può optare per (almeno) due direzioni:
a.1) restituire questi valori sulla porta (la stessa?) usb che comunica con linux. In questo caso ci penserà poi un programma su linux a fare da datalog.
a.2) realizzare il datalog su una memoria sd all'interno dello shield eth (che ho preso, in previsione di questo tipo di funzione), per poi andare a interrogare/interfacciare questo serverino http con altri sistemi presenti in Lan (o anche wan, dipende).

Quindi ripeto, cosa ne pensate?

Tnx, per l'attenzione (e la pazienza per il lungo 3d)

Salvatore
14  International / Hardware / Pilotare delle resistenze in funzione della produzione FV on: November 15, 2012, 06:06:10 pm
Premesso che so poco o nulla di programmazione, salvo capire un po' la lingua italiana e dedicare del tempo per imparare, C, C "semplificato" per Arduino ecc..

Ho dei pannelli solari FV, un boiler da 1500 lt d'acqua per il riscaldamento (a pavimento) che attualmente viene riscaldata (pochissimo) dai pannelli solari termici e (moltissimo) dalla caldaia a gas GPL.

Il progettino consiste nell'inserire due resistenze elettriche nel boiler, alimentarle con la corrente proveniente dai pannelli FV, e pilotare l'alimentazione di queste resistenze con un arduino.
Arduino dovrebbe prendere i valori di produzione del FV da un pc linux dedicato (a basso consumo, 6w) che è già attivo e funge egregiamente da dataloger, e che ha solo uscite usb ed Eth.
Linux (che monta Archilinux) archivia dei files csv e txt. Devo scrivere qualche routine che invia il valore numerico sulla usb collegata ad Arduino Uno i valori medi ultimi in ordine di tempo, scaricati dall'inverter in tempo reale via RS485.
A questo punto Arduino, a seconda del segnale che arriva da Linux (elaborato con algoritmo in funzione della produzione FV e della relativa convenienza economica), deve accendere una o più resistenze ad immersione nel boiler, tramite lo shield relay collegato.

Cosa ne pensate del progetto?

Sarà difficile scrivere il codice? Mah, mi ricorda tanto quando mi regalarono il Meccano, a 7 anni...  smiley-lol

Ciao, Salvatore
15  International / Hardware / Re: Domotica, dati e lista della spesa on: November 14, 2012, 05:09:40 am
Ciao Pecas,

anch'io sono più o meno nelle tue condizioni, con l'aggravante che di programmazione proprio proprio... :-/

sono indeciso se prendere la board Uno e tutto il materiale compatibile o se prendere la Due e aspettare la verifica delle compatibilità (anche come codice per la programmazione :-//

ma vedo che non ci sono molti interventi in proposito, nessuno si sbilancia, anche fuori da questo 3d...

Ciao, Salvatore
Pages: [1] 2