Go Down

Topic: proget.ino (Read 276 times) previous topic - next topic

-d0b-

Feb 02, 2019, 06:53 pm Last Edit: Feb 02, 2019, 07:07 pm by -d0b-
salve apro questo post per coinvolgere qualcuno che abbia voglia di darmi qualche suggerimento per proseguire in questo proget.ino....

è molto semplice, infatti con arduino yun vorrei monitorare l ambiente di casa mia visualizzandole su una pagina web e al massimo attivare un umidificatore....

i sensori che uso sono quelli che avevo gia:

dht22 temperatura-umidita
gl5528 fotoresistenza
mq135 co2
in piu un sensore umidita terreno tanto per ricordarmi di dare da bere alle piante

lo scketch che ho fatto è qua e prevede anche il salvataggio dei dati sulla SD..

Code: [Select]
#include <Bridge.h>
#include <BridgeServer.h>
#include <BridgeClient.h>
#include <FileIO.h>

#include "MQ135.h"
MQ135 gasSensor = MQ135(A3);

#include "DHT.h"
#define DHTPIN A2    
#define DHTTYPE DHT22  
DHT dht(DHTPIN, DHTTYPE);
BridgeServer server;

void setup() {
 Bridge.begin();
 server.listenOnLocalhost();
 server.begin();
 dht.begin();
 FileSystem.begin();
}

void loop() {

  BridgeClient client = server.accept();

  if (client) {
     temp(client);
     umi(client);
     terreno(client);
     lux(client);
     co2(client);
     sd(client);
    client.stop();
  }
  delay(50); // Poll every 50ms
}

void process(BridgeClient client) {

  String command = client.readStringUntil('/');

  if (command == "temp") {
    temp(client);
  }
  if (command == "umi") {
    umi(client);
  }
  if (command == "terreno") {
    terreno(client);
  }
  if (command == "lux") {
    lux(client);
  }
  if (command == "co2") {
    co2(client);
  }
  if (command == "sd") {
    sd(client);
  }  
}


void temp(BridgeClient client) {
 static float t;
 
 t = dht.readTemperature();
 client.print(" #### ");
 client.print("temperature");
 client.print("=");
 client.print(t);
 client.print(" - ");
 client.print("");
 }
 
void umi(BridgeClient client) {
 static float h;
 
 h = dht.readHumidity();
 client.print("humidity");
 client.print("=");
 client.print(h);
 client.print(" #### ");
 client.print("");
}

void terreno(BridgeClient client) {
 static float th;
 
 th = analogRead(A0);
 client.print("Umidita Terreno");
 client.print("=");
 client.print(th);
 client.print(" #### ");
 client.print("");
}

void lux(BridgeClient client) {
   static float lux;

 lux = analogRead(A1);
 client.print("Lux");
 client.print("=");
 client.print(lux);
 client.print(" #### ");
}

void co2(BridgeClient client) {
   static float co2;

  co2 = analogRead(A3);
  client.print ("raw = ");
  client.print (co2);
  float zero = gasSensor.getRZero();
  client.print (" rzero: ");
  client.print (zero);
  float ppm = gasSensor.getPPM();
  client.print (" ppm: ");
  client.print (ppm);
}

void sd(BridgeClient client) {

 float t;
 float h;
 float th;
 float lux;
 float co2;

 lux = analogRead(A1);
 th = analogRead(A0);
 t = dht.readTemperature();
 h = dht.readHumidity();
 co2 = analogRead(A3);
 
    // make a string that start with a timestamp for assembling the data to log:
  String dataString;
  dataString += getTimeStamp();
  dataString += " = ";

    // read three sensors and append to the string:
  for (int analogPin = 0; analogPin < 3; analogPin++) {
    int sensor = analogRead(analogPin);
    dataString += String(sensor);
    if (analogPin < 1) {
      dataString += ",";  // separate the values with a comma
    }
  }

    // open the file. note that only one file can be open at a time,
    // so you have to close this one before opening another.
    // The FileSystem card is mounted at the following "/mnt/FileSystema1"
  File dataFile = FileSystem.open("/mnt/sd/datalog.txt", FILE_APPEND);

    // if the file is available, write to it:
  if (dataFile) {
    dataFile.print(getTimeStamp());
    dataFile.print (",");
    dataFile.print(h);
    dataFile.print (",");
    dataFile.print(t);
    dataFile.print (",");
    dataFile.print(th);
    dataFile.print (",");
    dataFile.print(lux);
    dataFile.print (",");
    dataFile.println(co2);
    dataFile.close();
    }
  delay(300);

}

   // This function return a string with the time stamp
  String getTimeStamp() {
  String result;
  Process time;
  // date is a command line utility to get the date and the time
  // in different formats depending on the additional parameter
  time.begin("date");
  time.addParameter("+%D-%T");  // parameters: D for the complete date mm/dd/yy
  //             T for the time hh:mm:ss
  time.run();  // run the command

  // read the output of the command
  while (time.available() > 0) {
    char c = time.read();
    if (c != '\n') {
      result += c;
    }
  }

  return result;
}


Il tutto funziona ma sicuramente ci sono delle imprecisioni, errori di concetto ecc e cce che magari mi potete aiutare a correggere... grazie

Silente

Vista la sequenza di if (lastringa=="qualcosa")... ho visto una discussione in cui si parlava si parlava di un riconoscitore universale di comandi che, in poche righe, ti permette di fare quello che fa la funzione in modo non bloccante e senza usare String. Il titolo centrava con GREP
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

Silente

Poi c'é un motivo er cui fai tante client.print ("..."); di fila senza farne una sola? Inoltre credo che si possa scrivere anche client.print(F("...")); per memorizzare la stringa nella kemoria programmi.
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

-d0b-

aggiunto F:
Code: [Select]
void temp(BridgeClient client) {
 static float t;
 
 t = dht.readTemperature();
 client.print(F(" #### "));
 client.print(F("temperature"));
 client.print(F("="));
 client.print(t);
 client.print(F(" - "));
 client.print(F(""));
 }
 
void umi(BridgeClient client) {
 static float h;
 
 h = dht.readHumidity();
 client.print(F("humidity"));
 client.print(F("="));
 client.print(h);
 client.print(F(" #### "));
 client.print(F(""));
}

void terreno(BridgeClient client) {
 static float th;
 
 th = analogRead(A0);
 client.print(F("Umidita Terreno"));
 client.print(F("="));
 client.print(th);
 client.print(F(" #### "));
 client.print(F(""));
}

void lux(BridgeClient client) {
   static float lux;

 lux = analogRead(A1);
 client.print(F("Lux"));
 client.print(F("="));
 client.print(lux);
 client.print(F(" #### "));
}

void co2(BridgeClient client) {
   static float co2;

  co2 = analogRead(A3);
  client.print (F("raw = "));
  client.print (co2);
  float zero = gasSensor.getRZero();
  client.print (F(" rzero: "));
  client.print (zero);
  float ppm = gasSensor.getPPM();
  client.print (F(" ppm: "));
  client.print (ppm);
}


Quote
Poi c'é un motivo er cui fai tante client.print ("...")
semplicemente perche non so fare altrimenti.... ho seguito l'esempio BRIDGE.

per GREP intendi quello di cui parlano in questa discussione? =>   GREP non vuol dire greppia

-d0b-

per la print line dici di fare, ad esempio, così:

Code: [Select]

 Serial.println(timeString);
      int sensorValue = analogRead(A1);
      // convert the reading to millivolts:
      float voltage = sensorValue *  (5000 / 1024);
      // convert the millivolts to temperature celsius:
      float temperature = (voltage - 500) / 10;
      // print the temperature:
      client.print("Current time on the Y&uacute;n: ");
      client.println(timeString);
      client.print("<br>Current temperature: ");
      client.print(temperature);
      client.print(" &deg;C");
      client.print("<br>This sketch has been running since ");
      client.print(startString);
      client.print("<br>Hits so far: ");
      client.print(hits);
    }


inserendola nel loop ... la fonte è questa

Silente

Tutto giusto. Puoi implementare la F() anche alle print lunghe che hai fatto nel secondo programma.
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

-d0b-

#6
Feb 03, 2019, 08:22 pm Last Edit: Feb 04, 2019, 12:05 am by -d0b-
ho dato un occhio veloce al grep... ma non ne ho capito molto...

però ho rifatto un po lo sketch seguendo i tuoi consigli ...

Code: [Select]
#include <Bridge.h>
#include <BridgeServer.h>
#include <BridgeClient.h>
#include <FileIO.h>

#include "MQ135.h"
MQ135 gasSensor = MQ135(A3);

#include "DHT.h"
#define DHTPIN A2     
#define DHTTYPE DHT22   
DHT dht(DHTPIN, DHTTYPE);
BridgeServer server;

void setup() {
 Bridge.begin();
 server.listenOnLocalhost();
 server.begin();
 dht.begin();
 FileSystem.begin();
}

void loop() {
  BridgeClient client = server.accept();

  if (client) {
    String command = client.readString();
    command.trim();       
    Serial.println(command);
     ambiente(client);
     sd(client);
    client.stop();
   }
}


void process(BridgeClient client) {
  String command = client.readStringUntil('/');

  if (command == "ambiente") {
    ambiente(client);
      } 
  if (command == "sd") {
    sd(client);
      }   
  } 

void ambiente(BridgeClient client) {
  static float t;
  static float h;
  static float th;
  static float lux;
  static float co2;
 
  float zero = gasSensor.getRZero();
  float ppm = gasSensor.getPPM();
 
  t = dht.readTemperature();
  h = dht.readHumidity();
  th = analogRead(A0);
  lux = analogRead(A1);
  co2 = analogRead(A3);

  Process time;
   time.runShellCommand("date +%D-%T");
   String timeString = "";
   while (time.available()) {
   char c = time.read();
   timeString += c;
   }
   
  Serial.println(timeString);
      client.println(F("proget.ino che diventera umid.ino "));
      client.println(F(""));
      client.print(F("data -- "));
      client.print(timeString);
      client.println(F(""));
      client.println(F("  Monitoraggio Ambiente"));
      client.println(F(""));
      client.print(F("Temperatura"));
      client.print(F(" = "));
      client.print(t);
      client.println(F(" C"));
      client.print(F("Umidita"));
      client.print(F(" = "));
      client.print(h);
      client.println(F("%"));
      client.print(F("Umidita Terreno"));
      client.print(F(" = "));
      client.print(th);
      client.println(F("%"));
      client.print(F("Lux"));
      client.print(F(" = "));
      client.print(lux);
      client.println(F(" lx"));
      client.println(F(""));
      client.println(F("  Monitoraggio CO2"));
      client.println(F(""));
      client.print (F("raw = "));
      client.println (co2);
      client.print (F("rzero = "));
      client.println (zero);
      client.print (F("ppm = "));
      client.println (ppm);

  delay(300);
}

void sd(BridgeClient client) {
 float t;
 float h;
 float th;
 float lux;
 float co2;

 lux = analogRead(A1);
 th = analogRead(A0);
 t = dht.readTemperature();
 h = dht.readHumidity();
 co2 = analogRead(A3);
 
    // make a string that start with a timestamp for assembling the data to log:
  String dataString;
  dataString += getTimeStamp();
  dataString += " = ";

    // read three sensors and append to the string:
  for (int analogPin = 0; analogPin < 3; analogPin++) {
    int sensor = analogRead(analogPin);
    dataString += String(sensor);
    if (analogPin < 1) {
      dataString += ","; 
    }
  }

 
  File dataFile = FileSystem.open("/mnt/sd/datalog.txt", FILE_APPEND);

  if (dataFile) {
    dataFile.print(getTimeStamp());
    dataFile.print (",");
    dataFile.print(h);
    dataFile.print (",");
    dataFile.print(t);
    dataFile.print (",");
    dataFile.print(th);
    dataFile.print (",");
    dataFile.print(lux);
    dataFile.print (",");
    dataFile.println(co2);
    dataFile.close();
    }
  delay(300);
}
  String getTimeStamp() {
  String result;
  Process time;
  time.begin("date");
  time.addParameter("+%D-%T"); 
  time.run(); 
  while (time.available() > 0) {
    char c = time.read();
    if (c != '\n') {
      result += c;
    }
  }
  return result;
}


tutto quello che c'era prima è stato riassunto nel void ambiente, in effetti è meglio.

Una curiosita: pur avendo inserito client.println la stringa non va a capo, come mai? puo essere il file index?

Code: [Select]
<!DOCTYPE html>
<html>
 <head>
 <script type="text/javascript" src="zepto.min.js"></script>
  <script type="text/javascript">
   function refresh() {
   $('#content').load('/arduino/ambiente/');
   }
</script>

 </head>
 <body onload="setInterval(refresh, 2000);">
 <span id="content">0</span>
 </body>
</html>

 

inoltre ho una ripetizione di variabili sia in void ambiente che in void sd, non viene segnalato come errore, ma ci potrebbe essere una soluzione alternativa?

Code: [Select]

static float t;
  static float h;
  static float th;
  static float lux;
  static float co2;
 
  float zero = gasSensor.getRZero();
  float ppm = gasSensor.getPPM();
 
  t = dht.readTemperature();
  h = dht.readHumidity();
  th = analogRead(A0);
  lux = analogRead(A1);
  co2 = analogRead(A3);

  

-d0b-

#7
Feb 03, 2019, 11:07 pm Last Edit: Feb 04, 2019, 05:30 pm by -d0b-
Quote
Una curiosita: pur avendo inserito client.println la stringa non va a capo, come mai? puo essere il file index?
mi rispondo da solo: visualizzavo la pagina contenente i dati con http://YUN_ip/sd/

mentre se mi collego alla pagina http://YUN_ip/arduino/www/index.html tutto fila liscio.

Go Up