Offline
Edison Member
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
|
 |
« Reply #45 on: November 12, 2012, 10:51:34 am » |
Se hai qualche idea anche su come collegare il device al PC via USB senza resettarlo necessariamente Questo credo che andrebbe contro il funzionamento base dell'arduino, quindi direi di lavorare sul discorso eeprom in modo che al reset non perda la programmazione.
|
|
|
|
|
Logged
|
|
|
|
|
Torino (Italy)
Offline
Full Member
Karma: 0
Posts: 224
A ciascuno l'arte sua, e le pecore ai lupi.
|
 |
« Reply #46 on: November 12, 2012, 01:02:41 pm » |
 tuxduino ci deve essere un errore ! struct Allarme { byte ora; byte minuto; byte idPaziente; byte idMedicina; };
const int MAX_NUM_ALLARMI = 32;
struct Allarme allarmi[MAX_NUM_ALLARMI];
// valori di default per gli allarmi: allarmi[0] = { 8, 0, 1, 1 }; allarmi[1] = { 8, 30, 1, 2 }; Scusa, ma son acciaccato con il C.
|
|
|
|
|
Logged
|
Un saluto a tutta la comunità. Giuseppe G.
|
|
|
|
Offline
Edison Member
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
|
 |
« Reply #47 on: November 12, 2012, 01:17:46 pm » |
Sì, in effetti le assegnazioni di default non funzionano. Me ne sono accorto dopo ma mi sono scordato di pubblicare la soluzione. Scusa. Secondo me è meglio usare la costante come numero massimo di allarmi, ed introdurre una variabile numAlarms che tiene conto del numero di allarmi effettivamente inseriti. Con una funzione del tipo addAlarm(h, m, patient, medicine) la cosa diventerebbe: addAlarm( 8, 0, 1, 1 ); addAlarm( 8, 30, 1, 2 );
Questa funzione si preoccupa di incrementare numAlarms e di controllare che ci sia ancora posto nell'array degli allarmi. Vedo se riesco a postarla a breve insieme ad un altro po' di codice di contorno...
|
|
|
|
|
Logged
|
|
|
|
|
Torino (Italy)
Offline
Full Member
Karma: 0
Posts: 224
A ciascuno l'arte sua, e le pecore ai lupi.
|
 |
« Reply #48 on: November 12, 2012, 01:48:59 pm » |
 Riaprendo il libro Allarme allarmi={8, 0, 1, 1 }; dove "allarmi" è il valore dell'indice. senza le parentesi quadre Ora provo così. Ciao
|
|
|
|
|
Logged
|
Un saluto a tutta la comunità. Giuseppe G.
|
|
|
|
Offline
Edison Member
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
|
 |
« Reply #49 on: November 12, 2012, 01:51:41 pm » |
In questo modo allarmi è una singola struct, non un array.
|
|
|
|
|
Logged
|
|
|
|
|
Torino (Italy)
Offline
Full Member
Karma: 0
Posts: 224
A ciascuno l'arte sua, e le pecore ai lupi.
|
 |
« Reply #50 on: November 12, 2012, 03:41:38 pm » |
 Mi sono perso. Aiutoooooooo! tuxduino!!! Non è molto semplice lavorare con le struct, quando praticamente non esistono esempi da dove prendere spunto. Io ricordo molto poco... Qualcuno ha dei consigli ? 
|
|
|
|
|
Logged
|
Un saluto a tutta la comunità. Giuseppe G.
|
|
|
|
Offline
Edison Member
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
|
 |
« Reply #51 on: November 12, 2012, 05:06:42 pm » |
Ti faccio un esempio (spero) semplice per chiarire a livello base come si usano le struct. struct Punto { int x; int y; };
// inizializzazione all'atto della dichiarazione struct Punto p = { 1, 2 };
// array di struct const byte NUM_PUNTI = 10; struct Punto elencoPunti[NUM_PUNTI];
// accesso ai singoli campi di una struct // passaggio di una struct come argomento di una funzione void stampaPunto(struct Punto p) { Serial.print('('); Serial.print(p.x, DEC); Serial.print(','); Serial.print(p.y, DEC); Serial.print(')'); }
// scansione di un array di struct // passare un array di struct come argomento di una funzione void stampaPunti(struct Punto punti[]) { for (byte i = 0; i < NUM_PUNTI; i++) { stampaPunto(punti[i]); Serial.println(); } }
void traslaPunti(struct Punto punti[], struct Punto p) { for (byte i = 0; i < NUM_PUNTI; i++) { punti[i] = sommaPunti(punti[i], p); } }
// struct come valore di ritorno di una funzione struct Punto sommaPunti(struct Punto a, struct Punto b) { struct Punto c; c.x = a.x + b.x; c.y = a.y + b.y; return c; }
void setup() { Serial.begin(9600); for (byte i = 0; i < NUM_PUNTI; i++) { elencoPunti[i].x = 0; elencoPunti[i].y = 0; } stampaPunti(elencoPunti); }
void loop() { traslaPunti(elencoPunti, p); stampaPunti(elencoPunti); delay(2000); }
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Edison Member
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
|
 |
« Reply #52 on: November 12, 2012, 07:23:04 pm » |
Per la cronaca, ho ricominciato a smanettare con Time.h e TimeAlarm.h (11k di codice per un semplice orologio su lcd...  ). Debbo capire come manipolare l'elenco degli allarmi e salvarlo su eeprom. Ho messo insieme un orologio con lo shield lcd+keypad di Nuelectronics e il modulo RTC con batteria di sparkfun. Per impostare data e ora, basta inviare tramite il serial monitor una stringa formattata così: AAAA-MM-DD hh:mm:ss seguita da CR e/o LF Una volta impostate data e ora, l'orologio va avanti anche ad arduino spento, grazie alla pila al litio. Alla successiva accensione (o reset) l'aggeggio mostra ancora l'ora esatta! // Orologio con DS1307 su modulo RTC di Sparkfun e Nuelectronics lcd+analog keypad shield. // // Per impostare l'ora, inviare tramite seriale una stringa con il seguente formato: // AAAA-MM-GG hh:mm:ss // seguita da cr e/o lf //
#include <Time.h> #include <Wire.h> #include <DS1307RTC.h> #include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // lcd pins for nuelectronics lcd+keypad shield const short LCD_ROWS = 2; const short LCD_COLS = 16;
void displayDateTime(int weekday, int d, int m, int y, int h, int mn, int s) { char buf[20]; lcd.clear(); lcd.setCursor(0, 0); lcd.print(dayShortStr(weekday)); sprintf(buf, "%02d-%02d-%04d", d, m, y); lcd.setCursor(6, 0); lcd.print(buf); sprintf(buf, "%02d:%02d:%02d", h, mn, s); lcd.setCursor(4, 1); lcd.print(buf); }
void setDateTime(const char* buf) { int t_hr; int t_min; int t_sec; int t_day; int t_mon; int t_year; sscanf(buf, "%4d-%2d-%2d %2d:%2d:%2d", &t_year, &t_mon, &t_day, &t_hr, &t_min, &t_sec); setTime(t_hr, t_min, t_sec, t_day, t_mon, t_year); RTC.set(now()); }
const byte SERIAL_BUFLEN = 20; char serialBuffer[SERIAL_BUFLEN] = { 0 }; byte serialCnt = 0;
void processChar(char ch) { if (ch == '\r' || ch == '\n') { serialBuffer[serialCnt] = 0; if (serialCnt == 19) { setDateTime(serialBuffer); } serialCnt = 0; } else if (serialCnt < SERIAL_BUFLEN - 1) { serialBuffer[serialCnt] = ch; serialCnt++; } }
void splashScreen() { lcd.clear(); lcd.print(" LCD CLOCK"); delay(1000); }
void setup() { lcd.begin(LCD_COLS, LCD_ROWS); Serial.begin(9600); setSyncProvider(RTC.get); // the function to get the time from the RTC splashScreen(); }
void loop() { static unsigned long prevMillis;
// ogni secondo visualizziamo data e ora if (millis() - prevMillis >= 1000) { prevMillis = millis();
time_t t = now(); displayDateTime(weekday(t), day(t), month(t), year(t), hour(t), minute(t), second(t)); } if (Serial.available() > 0) { char ch = Serial.read(); processChar(ch); } }
|
|
|
|
|
Logged
|
|
|
|
|
Torino (Italy)
Offline
Full Member
Karma: 0
Posts: 224
A ciascuno l'arte sua, e le pecore ai lupi.
|
 |
« Reply #53 on: November 13, 2012, 02:33:59 am » |
 Bene, questo risolverebbe anche il problema del reset alla connessione con il PC una volta caricato in eprom i parametri. Anche se la shield costa più di arduino!! Dove posso trovare la shield ? Però in questo modo si liberebbero almeno (6pinxLCD, 3pinxkey, 1xBuzzer). Opzione per l'upgrade interessante. Ciao.
|
|
|
|
|
Logged
|
Un saluto a tutta la comunità. Giuseppe G.
|
|
|
|
Offline
Edison Member
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
|
 |
« Reply #54 on: November 13, 2012, 02:41:26 am » |
Scusa, quale shield ? La eeprom è dentro l'atmega328. L'interfaccia i2c è integrata (pin A4 e A5), e per l'RTC è sufficiente un oggettino tipo questo https://www.sparkfun.com/products/99 (che è quello che ho io attualmente). I display LCD seriali si pilotano con 1 pin e la libreria NewSoftSerial (o come si chiama adesso...).
|
|
|
|
|
Logged
|
|
|
|
|
Torino (Italy)
Offline
Full Member
Karma: 0
Posts: 224
A ciascuno l'arte sua, e le pecore ai lupi.
|
 |
« Reply #55 on: November 13, 2012, 03:14:32 am » |
 Che tu sappia esistono shield con LCD, Keypad, Buzzer ed RTC ? Lo shield che hai usato tu ha solo LCD+Keypad giusto? Che se non sbaglio costa circa 30$. Più RTC con costo di circa 15$. Calcolando il totale siamo a 25$ Arduino + 30 +15 = 70$ + iva, + 32Led + materiale per la bacheca + alimentatore Il costo del progetto comincia a lievitare !!! Però analizziamo i costi per un confronto: Al momento io ho speso 25E per arduino uno 10E per la bacheca 10E per i led ad alta efficenza 2E per i pulsantini 1E per il pulsante di ACK 2E per l'altoparlante 7E per il display 5E per l'alimentatore 4E per la batteria 3E per le resistenze, diodi, transistor e condensatori 5E per connetori e cavi per i collegamenti ___ 74E totali contro circa 110E per l'upgrade. (50% in più del prezzo base) Solo come discussione: "Occorre ragionarci su, se si vuole poi integrare la comunicazione ETH ed un arduino più potente il dispositivo diventa costoso". Ciao.
|
|
|
|
|
Logged
|
Un saluto a tutta la comunità. Giuseppe G.
|
|
|
|
Offline
Edison Member
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
|
 |
« Reply #56 on: November 13, 2012, 03:49:12 am » |
Che tu sappia esistono shield con LCD, Keypad, Buzzer ed RTC ? No. Ho anche fatto qualche ricerca, ma nada. Per quanto riguarda l'adozione di un micro + potente, direi che mantenendo i piedi per terra si fa tutto con l'UNO. Ovvio che se uno vuole controllare la programamzione via web, con sms, avvisi sonori (tipo vocina che ti dice il nome della medicina da prendere e la quantità), ecc., allora si passa facilmente al raspberry ;-)
|
|
|
|
|
Logged
|
|
|
|
|
Tuscany
Offline
Edison Member
Karma: 20
Posts: 1049
|
 |
« Reply #57 on: November 13, 2012, 04:11:50 am » |
Cosi' recuperi anche i pin necessari alla scheda Ethernet
|
|
|
|
« Last Edit: November 13, 2012, 04:16:55 pm by brunello »
|
Logged
|
|
|
|
|
Torino (Italy)
Offline
Full Member
Karma: 0
Posts: 224
A ciascuno l'arte sua, e le pecore ai lupi.
|
 |
« Reply #58 on: November 13, 2012, 05:24:49 am » |
 Certo brunello, bisognerebbe verificare però, anche se la DUE, che lavora a 84Mhz sia più precisa nel conteggio del secondo per la libreria time, che ad occhio dovrebbe avere una precisione 5 volte maggiore e che costa circa 48E (quasi come Arduino Uno+RTC) ma con molti più pin disponibili. Tornando a noi tuxduino, hai novità sull'utilizzo delle struct array?
|
|
|
|
|
Logged
|
Un saluto a tutta la comunità. Giuseppe G.
|
|
|
|
Offline
Edison Member
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
|
 |
« Reply #59 on: November 13, 2012, 05:30:03 am » |
 Certo brunello, bisognerebbe verificare però, anche se la DUE, che lavora a 84Mhz sia più precisa nel conteggio del secondo per la libreria time, che ad occhio dovrebbe avere una precisione 5 volte maggiore e che costa circa 48E (quasi come Arduino Uno+RTC) ma con molti più pin disponibili. Tornando a noi tuxduino, hai novità sull'utilizzo delle struct array? La precisione nel conteggio del tempo la fornisce l'RTC. UNO o DUE non fa differenza. Per quanto riguarda l'implementazione dell'elenco di allarmi come array di struct, ho scritto la addAlarm(), a breve ti posto qualcosa.
|
|
|
|
|
Logged
|
|
|
|
|
|