SQL Temperatur Daten Logger

SQL Daten Logger mit einem Arduino UNO

In diesem Bericht wird gezeigt, wie man einen SQL Temperatur Daten Logger aufsetzt.

Folgende Schritte wurden hier umgesetzt:

  1. Eine Datenbank aufsetzten hier „userdb“ mit einer Tabelle hier „temp_data“. Es gibt zwei Spalten eine mit einem automatischen SQL Timestamp „datetime“ und der Temperaturwert „temp_value“.
  2. Den Arduino programmiert

hier ein Video wie der Ablauf programmiert ist. Ein „button“ ein Temperatursensor und eine LED.

Hier der Code erklärt

Zuerst die Grundlegende Verbindung für den Insert

#include 
#include 
#include 

byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };


IPAddress server_addr(192,168,178,86);  // IP des MySQL Servers
char user[] = "admin";              // MySQL Username
char password[] = "*****";        // MySQL password

// Sample query
char INSERT_SQL[] = "INSERT INTO userdb.temp_data (temp_value) VALUES (1.5)";

EthernetClient client;
MySQL_Connection conn((Client *)&client);

void setup() {
  Serial.begin(9600);
  while (!Serial); // wait for serial port to connect
  Ethernet.begin(mac_addr);
  Serial.println("Connecting...");
  if (conn.connect(server_addr, 3306, user, password)) {
    delay(1000);
  }
  else
    Serial.println("Connection failed.");
}


void loop() {
  delay(5000);

  Serial.println("Recording data.");

  // Init der Query Klasse
  MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
  // Query ausfuehren
  cur_mem->execute(INSERT_SQL);
  // der "Cursor" löschen und den Speicher wieder freizugeben
  // Sonst kann es sein, das der Microcontroller gegen die Wand
  //  fährt weil der Speicher aufgebraucht ist.
  delete cur_mem;
}

Danach die Anpassung um einen Temperaturfühler einzubinden

#include 
#include 
#define ONE_WIRE_BUS 3 //Temperatursensor/en DATA Kabel an Pin 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
char temperatureString[6] = "";

void setup() {
  
  Serial.begin(9600);
  while (!Serial); // wait for serial port to connect

  DS18B20.begin();
}

void loop() {

  float temperature = getTemperature(0);
  dtostrf(temperature, 2, 1, temperatureString);
  Serial.println(temperatureString);      
}//Loop end

float getTemperature(int val_index) {
    float temp;
    do {
      DS18B20.requestTemperatures(); 
      temp = DS18B20.getTempCByIndex(val_index);
      delay(100);
    } while (temp == 85.0 || temp == (-127.0));
    return temp;
}

Die Grundlagen sind aus dem Buch von Dr. Charles Bell => „MySQL for the Internet of Things“

hier die Blogseite des Dr. : http://drcharlesbell.blogspot.com/

Hier jetzt noch ein Beispiel, wie man den Feuchtesensor und Temperatur Sensor DTH22 ausliest und anschließend einen SQL String baut um Ihn ebenfalls senden zu können. Zuerst die nötigen Bibliotheken:


#include  //need for DHT
#include 
#include 
#include 
#include 
#include 
#include 

#define DHTPIN 27
#define DHTTYPE DHT22 //DHT11, DHT21, DHT22

DHT dht(DHTPIN, DHTTYPE);

float Humi = 0;
float Temp = 0;

Dann muß der Sensor in der Loop des Controllers ausgelesen werden:

void readEnviroment_sensor(){
    Humi = dht.readHumidity();     //Luftfeuchte auslesen
    Temp = dht.readTemperature();  //Temperatur auslesen
    if (isnan(Temp) || isnan(Humi)) 
  {
    Serial.println("not able to read DHT22");
    Humi = 0;
    Temp = 0;
  } 
  else 
  {
    Serial.print("  Humidity: "); 
    Serial.print(Humi);
    Serial.print(" %\t");
    Serial.print("Temperature: "); 
    Serial.print(Temp);
    Serial.println(" C");
    
    digitalWrite(LED3, HIGH);
    delay(1000);
    digitalWrite(LED3, LOW);
  }
   }

Zuletzt kommt das Schwierigste. Hier müssen die zwei Global angelegten Variablen Humi und Temp in einem String zusammen gebaut werden, damit sie später dem SQL Cursor übergeben werden können. Je nachdem welchen Controller man benutzt ist darauf zu achten das die SQL Bibliothek viel Speicher in bei der Verarbeitung in Anspruch nimmt. In der Array Deklaration sollte man nur so viel Zeichen zu Verfügung stellen, wie der String lang ist. in :

stringOne.toCharArray(SQL, 128); // Save memory adjust the 128 according to your string to send

void sendquery(){

  String stringOne = "INSERT INTO userdb.valuesHumAndTemp_Table (humi,temp) VALUES (";
  String stringKom = ",";
  String endtag = ")";
  stringOne += Humi + stringKom += Temp + endtag;
  char SQL[128];
  stringOne.toCharArray(SQL, 128);
  Serial.println(SQL);
  AppendDisplayText(SQL);
  delay(100); 
  cur.execute(SQL); // Execute the query
  delay(100);
  cur.close();

  }