Go Down

Topic: Pilotare delle resistenze in funzione della produzione FV (Read 1 time) previous topic - next topic

leo72


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...

Arduino non è una distro con un repo da cui scaricare i programmi  ;)
Devi cercare progetti già fatti e condivisi sia qui sul forum che su internet, c'è veramente di tutto a giro.

Quote

- 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...

Qui esistono formule e modelli matematici ma non entro nel discorso perché sono assolutamente ignorante in materia. Attendiamo l'intervento di qualcun altro.

Quote

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.

Questo è facile, la comunicazione seriale è bidirezionale per cui puoi spedire dati all'Arduino come riceverli da esso.

Quote

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).

Meglio la prima soluzione, visto che hai già un minicomputer a cui agganci l'Arduino.


... (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!  XD
Si, l'osservazione è giusta, tra l'altro stavamo scrivendo in contemporanea  :)


Non era una bacchettatura, solo una precisazione. PS: qui siamo in 2 ad usare Arch Linux, io e l'utente lesto.

salvato

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: [Select]

#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;
}

MauroTec

Code: [Select]

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


Il codice sopra devi scriverlo così:
Code: [Select]

fdata=fopen(nome_file,"r");
if (fdata==NULL)
{
    printf("\n ***** Nome file dati non valido \n %s \n", nome_file); exit(0);
} // noterai la mancanza del ; dopo la parentesi }


In genere il codice interno a tutti i blocchi {} deve essere identato di almeno 4 caratteri o un tab (che di solito e di 8)
main() è una funzione. Il codice dentro la funzione è un blocco di codice delimitato da {} e va identato come detto sopra.

Code: [Select]

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

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

     };


Deve essere scritto così:

Code: [Select]

if (TEST == 1)
{
    printf("\n****\n\ntest mode start\n\n****\n\n");
    printf("The current filename is: %s\n\n", nome_file);
}


Copia l'errore qui, che vediamo se c'è altro.

Ciao.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

salvato

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


MauroTec

Domanda: Non puoi installare python e scrivere un programma in python?

Comunque in C (in unix ancora meglio) i dispositivi appaiono come dei file e si trovano sotto /dev, le seriali pure o no cominciano con tty, nel caso di semplice convertitore usb seriale tipo Arduino UNO il device si chiama /dev/ttyACM0.

Visto che i device sono file, si posso aprire e chiudere con open(), ma visto che sono dei file particolari ci sono altre funzioni per impostare la seriale.

Prova questo codice e dimmi se lavora.

Code: [Select]

#include <unistd.h>
#include <stdio.h>
#include <termios.h>
#include <sys/fcntl.h>


int main( int argc, char *argv[] )
{
struct termios termOptions;
char        port[1024];
int         ttyFid;

if( argc == 2 )
{
// Copy the port from the argument
strcpy( port, argv[1] );
printf( "Read port name: %s\n", port );
}
else
{
// No argument or incorrect number of arguments read:
printf( "Usage: setSer /dev/ttySX\n" );
return -1;
}

// Open the tty:
ttyFid = open( port, O_RDWR );
if (ttyFid == -1)
{
printf( "Error unable to open port: %s\n", port );
return -1;
}

// Get the current options:
tcgetattr( ttyFid, &termOptions );

// Set the input/output speed to 921.6kbps
cfsetispeed( &termOptions, B921600 );
cfsetospeed( &termOptions, B921600 );

// Now set the term options (set immediately)
tcsetattr( ttyFid, TCSANOW, &termOptions );

// All done
printf( "Done, port speed set on: %s\n", port );
}


Ciao.
AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Go Up