ciao a tutti, vorrei far comunicare arduino e processing per disegnare in tempo reale dei grafici corrente tensione.
fino ad ora ho semplicemente comunicato con il monitor seriale, copiato i risultati su excel e fatto i grafici.
ora vorrei automatizzare il plot dei grafici tramite processing.
questo il mio sketch:
#define RELAY_PIN 3 //digital pin to control the relay
#define c_pin A1 //capacitor analog pin
#define ps_pin A0 //power supply analog pin
#define num_misure 65
// defines for setting and clearing register bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
void setup()
{
// set prescale to 16
sbi(ADCSRA,ADPS2) ;
cbi(ADCSRA,ADPS1) ;
cbi(ADCSRA,ADPS0) ;
pinMode(RELAY_PIN, OUTPUT);
Serial.begin(9600); // open serial
Serial.println("Press the spacebar to start to measure");
}
void loop()
{
static int relayVal = 0;
int cmd;
float c_voltage, ps_voltage, current;
static float res = 3.59;
unsigned long int time1, time2, time0;
unsigned long int PS_TIME[num_misure], C_TIME[num_misure];
float PS_VOLTAGE[num_misure], C_VOLTAGE[num_misure], CURRENT[num_misure];
int j = 0;
while(Serial.available() > 0)
{
cmd = Serial.read();
switch(cmd)
{
case ' ':
{
relayVal ^= 1;
Serial.println("Relay on");
break;
}
default:
{
Serial.println("Press the spacebar to start to measure");
}
}
if(relayVal)
{
do{
digitalWrite(RELAY_PIN, HIGH);
delay(20); // relay transition time ---------- problema, ho impostato questo ritardo
// per aspettare la commutazione del relay, ma questa non è tempocostante
time0 = micros(); // time the measure start
do
{
c_voltage = analogRead(c_pin);
time1 = micros()-time0; //time c_voltage measurement
ps_voltage = analogRead(ps_pin);
time2 = micros() - time0; //time ps_voltage measurement
c_voltage = (c_voltage * 5) /1023;
ps_voltage = (ps_voltage * 5) / 1023;
current = ((ps_voltage - c_voltage)*1000)/res; // to obtain mA
//put all the measurements in their arrays
PS_VOLTAGE[j] = ps_voltage;
PS_TIME[j] = time2;
C_VOLTAGE[j]= c_voltage;
C_TIME[j] = time1;
CURRENT[j] = current;
j++;
delayMicroseconds(1380);
}
while(current >0 && j < num_misure);
//capacitor discharge
digitalWrite(RELAY_PIN, LOW);
do
{
c_voltage = (analogRead(c_pin) >> 2);
c_voltage = (c_voltage * 5) / 1023;
}
while(c_voltage > 0.001);
}
while( j <= num_misure - 1 );
//stampa risultati
Serial.println(" PS_VOLTAGE");
for ( j = 0; j < num_misure ; j++)
{
Serial.print(PS_VOLTAGE[j]);
Serial.print(" ");
Serial.println(PS_TIME[j]);
}
j=0;
Serial.println("\n\n CURRENT");
for ( j = 0; j < num_misure ; j++)
{
Serial.println(CURRENT[j]);
}
Serial.println(" C_VOLTAGE");
for ( j = 0; j < num_misure ; j++)
{
Serial.print(C_VOLTAGE[j]);
Serial.print(" ");
Serial.println(C_TIME[j]);
}
relayVal = 0; //reitialize relayVal
Serial.print("\n\n");
Serial.print("Do you want to repeat the measure?");
}
}
}
i grafici che mi serve stampare c_voltage vs. c_time; current vs ps_voltage; ps_voltage vs ps_time
come vedete, con questo codice rilevo i dati ad intervalli dell'ordine dei microsecondi, e purtroppo tale deve rimanere per avere un numero ragionevole di misure.
leggendo vari articoli sulla libreria firmata e processing (anche leggendo l'esempio stadardFirmata) noto che il loop va ogni 20ms, tempo decisamente troppo lungo per i miei scopi, dato che tutta la misura si svolge nel tempo di circa 50ms, e in questo intervallo di tempo devo prendere più misure possibili.
mi sapete indicare qualche metodo per poter plottare i tre grafici tramite processing?