Pannello solare, ricerca del sole

ciao a tutti ! Mi presento sono luca e sono uno studente di elettronica e telecomunicazioni . Ho avuto principalmente le nozioni di base che la scuola mi da e cioè il buon e vecchio visual basic, un po' di assembler sul 16F84A e ora siamo partiti con il c di mikroc. Ma affianco all' arduino mi sento molto più al sicuro ! L' area di progetto di quest' anno , per chi non sapesso cos'è l' area di progetto è un lavoro della classe per produrre o ottimizzare qualche progettointeressante, è stato proposto di replicare un pannello solare che insegua il sole in modo da ottimizzarne il rendimento. Le soluzioni proposte son sempre le stesse o almeno che la mia poca esperienza mi ha fatto conoscere e cioè il solito ponte e le solite fotoresistenze. Ma sei io all' accensione facevo una spazzolata e poi andavo a ricercare il valore massimo di tensione che avevo registrato . Ora la domanda fatidica sperando che non mi spariate contro , i dati gli aquisisco con un array che varia insieme al movimento del pannello e fin qui ok , trovo il valore massimo e mi posiziono; dopo un tot parte l' altra routine dove mi sposto di un poco verso il valore massimo che giustamente è cambiato con il tempo. Ma se l'array non è un problema , o almeno credo per ora :fearful: , il movimento dei servo lo sono ! io vorrei tenere la traccia della posizione del servo e dell' valore di tensione possibile nello stesso array? se no come una coppia di array o semplicemente un altro metodo ? datemi anche solo un' idea poi mi vado a cercare tranquillamente le cose grazie in anticipo ;)

crea un array bidimensionale.

io implementerei un vettore di struct

cioè ? scusa so cosè un vettore ma non di struct ...e che come mai lo consideri migliore quindi dell array bidimensionale ?

una struct la definisci come

typedef struct{ int valore1; char carattere1; //tutti i campi che vuoi, non per forza dello stesso tipo } miaStruttura;

poi dichiari

miaStruttura vettore[100];

e hai un vettore di 100 elementi, per ogni elemento puoi accedere ai singoli campi tramite

vettore[index].nomeCampo

Come soluzione, la ritengo più "elegante" di un array bidimensionale e tra l'altro puoi gestire dati di tipo diverso (anche se nel tuo caso mi pare di capire che vuoi salvare due valori entrambi dello stesso tipo, o sbaglio?)

no infatti non sbagli , sono tuti valori tranquillamente integer ma avrei bosogno dei chiarimenti sono troppo alle prime armi purtroppo :

typedef struct{ int valore1; char carattere1; //nel senso che definisco che tipo di variabile contengo giusto } miaStruttura;

vettore[index].nomeCampo nome campo sarebbe ?

nome campo dovrebbero essere le istanze salvate all'interno della struct! ad esempio vettore[index].valore1 accede al contenuto di valore1.

una struct è come una tabella nella quale puoi avere diversi campi di diversi tipi, quando scrivi

typedef struct{ int valore; char carattere; } miaStruttura;

definisci un nuovo tipo di dato (typedef) chiamato miaStruttura, e così come un elemento

int var;

contiene un intero, un elemento

miaStruttura var;

contiene un campo "valore" di tipo intero e uno "carattere" di tipo char (ovviamente perché io quando ho dichiarato la struttura ho deciso che avesse questi campi). Quindi crei un array

miaStruttura array[n]; con n=numero di elementi

e per ogni elemento dell'array potrai accedere ai vari campi.

array[3].valore; //legge il campo valore del terzo elemento dell'array

:cold_sweat: ma per 2 valori non era più semplice: int coppie[numero_step_servo] [numero_letture];

a okok mi piace è proprio bello sto metodo mi piace :) chiariscimi l'ultima cosa ...quindi in ogni caso quando definisco l' int valore devo metterci ad esempio int valore[numero di indici] e questa è il mio primo array giusto ? poi voglio come nel tuo caso un array di tipo char quindi faccio char carattere[numero di indici]. e questi sono sempre collegati dentro alla "miaStruttura".

mentre per l' array[3].valore se ho capito bene sarebbe nome_della_struct[indice].valore se vogliamo pescare il numero intero nell' array valore .

voglio sapere solo se ho capito queste cose qua e grazie per la tua pazienza

ma perchè char? non ti servivano i valori della lettura della tensione e la posizione del servo?

si hai ragione pure tu certo, ma ero preoccupato di non aver capito qualcosa di questo metodo di array che mi son lasciato prendere , meglio capire subito che poi trovarsi in futuro incasinati o sbaglio ? XD

la struct usala solo se hai campi di tipo diverso, infatti "spreca" un integer(2 byte) in più per ogni elemento, e se fai array anche di solo 100 elementi di 3 o 4 byte in arduino stai già rischiando di andare in overflow di ram

giusto non mi era passato nemmeno nell anticamera del cervello che c'è pure quel problema , come disse il grande saggio le cose più semplici sono a volte le migliori , in ogni caso grazie lo stesso a tutti !

(io ho due assi però questo vuol dire due array da due dim oppure conviene farne uno da 4 no giusto ? facendone 4 non ne utilizzo molti , ma se faccio solo un array e lo uso in parte per un asse e in parte per l' altra dovrei risparmiare di più che farne due giusto ? :) )

quindi prima definisco il mio primo array a due dimensioni , dopo parto con lo scan di un asse, finito quello confronto(anche se potrei mentre sto facendo lo scan confrontare il valore precedente con quello attuale in modo che appena vedo che il valore di tensione che ho rilevato minore del precedente vuol dire che ho raggiunto il massimo per un asse) mi sposto in quella posizione. ripeto il procedimento per l' altro asse con un altro array sempre bidimensionale ecc ecc ma mi sorge un dubbio in questo modo non mando in over in ogni caso il pic ? nn so quanto occupa alla fine tutto il programma :fearful:

scusami, ma è uno spreco di ram.

tu devi memoprizzare solo 3 valori: valore massimo di produzione rilevato e la sua posizione x e y. O magari solo 10 o 20 di queste posizioni, per poi scegliere di posizionarsi nelle coordinate dove si addensano di più i valori

Che poi, perché non memorizzare tutto nella EEPROM interna? In caso di blackout, la RAM parte e con essa tutte le letture effettuate, per cui le letture devono ripartire. 1024 byte di EEPROM memorizzano 333 triplette (lettura, posX, posY).

Secondo mè il panning dovresti farlo solo nel setup, ma giusto per sapere dove posizionare inizialmente i due assi, dopodichè nel loop, metti 4 fotoresistenze in croce e dal software fai in modo che i valori letti a coppie (sopra sotto e destra snistra) siano sempre uguali correggendo con i mtori quando serve. Le fotoresistenze andrebbero intubate per evitare ombre.