Buonasera a tutti,
scrivo qui nella speranza di ricevere aiuto da parte vostra nel creare questo programma che mi serve per un progetto di studio.
Possiedo una discreta base di elettronica ma purtroppo so programmare molto poco.
Devo creare un sistema Arduino, che deve essere posto attaccato alla pancia di un drone per monitorare una tubatura di 8 km.
Tramite questo sistema devo poter conoscere posizione, altezza e velocità del drone e devo acquisire le concentrazioni di metano e co2 eventualmente presenti nelle vicinanze della tubatura.
L’idea è quella di suddividere la tratta in 8 parti ciascuna di 1 km ed eseguire quindi 8 campagne di monitoraggio che consistono nel far sollevare il drone ad una determinata quota e proseguire mantenendo la quota lungo il gasdotto percorrendo 1 km percorso il quale il drone atterra e vengono prelevati i dati salvati su scheda sd.
Il circuito che ho pensato di creare è composto da un arduino mini che programmerò tramite seriale con un arduino uno. A questo arduino mini devo collegare un lettore di scheda sd per potere caricare i dati acquisiti su scheda, un gps che mi permetta di conoscere posizione, altezza e velocità del drone, ed infine i due sensori di metano e co2.
Per quanto riguarda il campionamento di ogni tratta ho pensato di eseguire un'acquisizione di dati per ogni 50 m percorsi quindi 200 campionamenti per ogni tratta.
Il mio ragionamento è quindi quello di impostare il programma non in funzione del tempo trascorso bensì della distanza percorsa dal drone che posso conoscere grazie al gps.
Sul web ho trovato il seguente programma che mi permette di salvare su scheda sd la posizione il tempo e la velocità del drone acquisite tramite gps.
#include <SD.h>
#define LED 8 // status LED for SD operations
#define BUFF_MAX 100 // size of GPS & SD buffers
File GPSlog;
void setup()
{
Serial.begin(4800); // The LS20031 GPS receiver must be set to 4800 for program to work
pinMode(10, OUTPUT); // Per SD library notes, pin 10 must be set to output
pinMode(LED, OUTPUT);
if (!SD.begin(4)) { // SD card detected?
digitalWrite(LED,LOW); // turn off staus LED if SD detection fails
return;
}
else digitalWrite(LED, HIGH); // turn on LED if SD detection is OK
GPSlog = SD.open("GPS.log", O_CREAT | O_WRITE); // open/append to a file GPS.log
if (!GPSlog) { // test if file can be opened
digitalWrite(LED,LOW); // turn off status LED if file open fails
return;
}
else digitalWrite(LED, HIGH); // turn on status LED if file open is OK
}
void loop()
{
char inBuffer[BUFF_MAX]; // buffer used to read NMEA lines from GPS
byte outBuffer[BUFF_MAX]; // buffer used to write NMEA lines to SD card
int sizeBuffer = 0; // counter of how many chars per line
while (Serial.available()>0) // if serial data available from GPS
{
sizeBuffer = Serial.readBytesUntil('\n', inBuffer, BUFF_MAX); // read one NMEA line from GPS until end of line
for (int i = 0; i < BUFF_MAX; i++) outBuffer[i] = inBuffer[i]; // create CSV file on SD
int j = 0;
if (GPSlog) {
GPSlog.write(outBuffer, sizeBuffer); // write GPS NMEA output to SD
GPSlog.print("\r\n");
GPSlog.flush();
digitalWrite(LED, HIGH); // Keep LED on so long as SD logging is working.
}
else {
// if the file didn't open, turn LED off
digitalWrite(LED, LOW); // turn LED off if writing to file fails
}
}
}
Ora il gps da quello che ho capito non mi permette di conoscere l’altezza del drone, il che significa che dovrei aggiungere anche un altimetro al circuito.
Per ovviare a ciò ho pensato di imporre un determinato intervallo di tempo necessario per portare il drone alla determinata altezza durante il quale quindi l’acquisizione dati è bloccata. Una volta trascorso tale intervallo, far partire il processo di acquisizione dati sfruttando il gps quindi impostare le acquisizioni in funzione della distanza percorsa.
Volevo chiedervi se potevate darmi una mano ad inserire i due sketch relativi ai sensori nello sketch principale relativo al geodata logging.
Qualsiasi tipo di consiglio ed aiuto è una risorsa preziosa per me.
Grazie
Questo è il programma che ho trovato per il sensore della CO2.
#include <MySensor.h>
#include <SPI.h>
#define CHILD_ID_AIQ 0
#define AIQ_SENSOR_ANALOG_PIN 6
unsigned long SLEEP_TIME = 30*1000; // Sleep time between reads (in milliseconds)
float valAIQ =0.0;
float lastAIQ =0.0;
MySensor gw;
MyMessage msg(CHILD_ID_AIQ, V_LEVEL);
MyMessage msg2(CHILD_ID_AIQ, V_UNIT_PREFIX);
void setup()
{
gw.begin();
// Send the sketch version information to the gateway and Controller
gw.sendSketchInfo("AIQ Sensor CO2 MH-Z14", "1.0");
// Register all sensors to gateway (they will be created as child devices)
gw.present(CHILD_ID_AIQ, S_AIR_QUALITY);
gw.send(msg2.set("ppm"));
gw.sleep(SLEEP_TIME);
pinMode(AIQ_SENSOR_ANALOG_PIN, INPUT);
}
void loop() {
//unsigned long duration = pulseIn(AIQ_SENSOR_ANALOG_PIN, HIGH);
while(digitalRead(AIQ_SENSOR_ANALOG_PIN) == HIGH) {;}
//wait for the pin to go HIGH and measure HIGH time
unsigned long duration = pulseIn(AIQ_SENSOR_ANALOG_PIN, HIGH);
//Serial.print(duration/1000); Serial.println(" ms ");
//from datasheet
//CO2 ppm = 2000 * (Th - 2ms) / (Th + Tl - 4ms)
// given Tl + Th = 1004
// Tl = 1004 - Th
// = 2000 * (Th - 2ms) / (Th + 1004 - Th -4ms)
// = 2000 * (Th - 2ms) / 1000 = 2 * (Th - 2ms)
long co2ppm = 2 * ((duration/1000) - 2);
//Serial.print(co2ppm);
if ((co2ppm != lastAIQ)&&(abs(co2ppm-lastAIQ)>=10)) {
gw.send(msg.set((long)ceil(co2ppm)));
lastAIQ = ceil(co2ppm);
}
//Serial.println();
// Power down the radio. Note that the radio will get powered back up
// on the next write() call.
gw.sleep(SLEEP_TIME); //sleep for: sleepTime
}
Questo infine è lo sketch che ho trovato per il sensore di metano:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
// read the input on analog pin 0:
int sensorValue = analogRead(A0);
// Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
float voltage = sensorValue * (5.0 / 1023.0);
// print out the value you read:
Serial.println(voltage);
}