Data opsamling fra drivhus

Raspberry Pi Webshop Fora Projekter Data opsamling fra drivhus

Viser 7 svartråde
  • Forfatter
    Indlæg
    • #9050
      hni
      Medlem

      Hej Alle!

      Jeg er ved at opsamle data fra mit drivhus.
      Det hele skal ende med at en Raspberry Pi skal lave en lokal-hjemmeside som jeg kan tilgå på min lokal IP adresse og se hvordan det går der ude.

      I slutningen af dette indlæg linker jeg fotos og programmer til dette projekt.

      I drivhuset henter en Attiny 85 disse data:
      Temperatur => (talområde = 150-350)
      Luftfugtighed => (talområde = 400-500)
      Sollys => (talområde = 600-700)

      Disse data deles op i forskellige talområder så jeg kan skelne hvilken data jeg modtager.

      Derefter sender den dem til en modtager (433mHz).

      Til at starte med brugte jeg en Arduino Uno til at modtage data’erne med og gemme dem på et SD-kort som CSV fil.
      Det virkede fint.

      Så satte jeg en Raspberry Pi til Arduino’en via USB og satte Raspberry Pi til at lave en CSV fil som jeg så kunne hente over lokalnetværket.

      Det virker ikke helt godt, Arduino’en sender en gang i mellem noget vrøvl til Raspberry Pi så mit Python programmet stopper, det må jegg finde en løsning på.

      Slut modtageren kommer til at bestå af en Attiny85 der modtager data og via serial sender dem til Raspberry Pi.

      Hjemmesiden skal bestå af følgende:
      Real-time visere (Temperatur, Luftfugtighed og Sollys)
      Et diagram der viser de sidste syv dage.
      Det med at lave en hjemmeside der kan læse data og vise grafer og visere, er ikke lige min stærke side. (amatør programmør)
      Jeg har lavet et snyde billede af hvordan jeg kunne tænke mig siden skal se ud.

      Og nu lidt link:

      Første sender i drivhuset:

      Færdig sender i drivhuset:

      Første modtager:

      Attiny85 sender program:

      #include
      #include "DHT.h"
      #define TxPin 4 // Ben til at sende data
      #define DHT22_PIN 1
      dht DHT;
      int lightPin = 7; //define a pin for Photo resistor
      int temp_c;
      float temp;
      float temp_t_f;
      int temp_t_i;
      int lys;
      float lys_t_f;
      int hum;
      float hum_t_f;
      int hum_t_i;
      float t;
      float h;
      float data;

      void setup()
      {
      man.setupTransmit(TxPin, MAN_1200);
      }

      void loop()
      {

      int chk = DHT.read22(DHT22_PIN);

      h = DHT.humidity;
      t = DHT.temperature;
      //Temperaturen afrundes
      temp_c = t;
      if (t < 0) //Temperaturen er mindere end 0C
      {
      temp_t_i = t;
      temp_t_f = temp_t_i - 0.5;
      if(t 0) //Temperaturen er mere end 0C
      {
      temp_t_i = t;
      temp_t_f = temp_t_i + 0.5;
      if(t >= temp_t_f)
      {
      temp_c = temp_t_i + 1;
      }
      }

      //Humidity afrundes
      hum = h;
      hum_t_i = h;
      hum_t_f = hum_t_i - 0.5;
      if(h <= hum_t_f)
      {
      hum = hum_t_i - 1;
      }

      lys = analogRead(lightPin);
      lys_t_f = lys;
      lys = lys_t_f/10.24;

      // Data der skal sendes, beregnes
      data=200+temp_c+(hum*1000)+(lys*1000000);

      // Der sendes
      man.transmit(data);
      data=0;

      delay(1000);
      }

      Arduino Uno modtager og gem CSV på SD-kort:

      #include //SD Card Library
      #include
      #define RxPin 4
      const int chipSelect = 10;
      int temp_c;
      int lys;
      int hum;
      int data;
      int i_t;
      int i_h;
      int i_l;
      int sfejl = 5;
      int skriver = 6;
      int fejl = 7;

      void setup()
      {
      i_t=0;
      i_h=0;
      i_l=0;
      man.setupReceive(RxPin, MAN_1200);
      man.beginReceive();
      Serial.begin(9600);

      while (!Serial) {
      ; // wait for serial port to connect. Needed for Leonardo only
      }
      Serial.print("Initializing SD card...");
      // make sure that the default chip select pin is set to
      // output, even if you don't use it:
      pinMode(10, OUTPUT);

      // see if the card is present and can be initialized:
      if (!SD.begin(chipSelect)) {
      Serial.println("Card failed, or not present");
      digitalWrite(fejl, HIGH);
      // don't do anything more:
      return;
      }
      Serial.println("card initialized.");

      }

      void loop()
      {
      // henter data
      if (man.receiveComplete())
      {
      data = man.getMessage();
      man.beginReceive();
      }

      // tjek temp
      if(data200)
      {
      temp_c = data -200;
      i_t=1;
      }
      }
      else
      {
      }

      // tjek hum
      if(data399)
      {
      hum = data -400;
      i_h=1;
      }
      }
      else
      {
      }

      // tjek lys
      if(data599)
      {
      lys = data -600;
      i_l=1;
      }
      }
      else
      {
      }

      // Er alle data opsamlet ???
      if(i_t + i_h + i_l == 3)
      {
      digitalWrite(skriver, HIGH);
      //Create Data string for storing to SD card
      //We will use CSV Format
      String dataString = (String(temp_c) + ", " + String(hum) + ", " + String(lys));

      // open the file. note that only one file can be open at a time,
      // so you have to close this one before opening another.
      File dataFile = SD.open("log.csv", FILE_WRITE);

      // if the file is available, write to it:
      if (dataFile) {
      dataFile.println(dataString);
      dataFile.close();
      // print to the serial port too:
      Serial.println(dataString);
      }
      // if the file isn't open, pop up an error:
      else {
      Serial.println("error opening log.csv");
      digitalWrite(sfejl, HIGH);
      }
      delay(5000);
      digitalWrite(skriver, LOW);
      i_t=0;
      i_h=0;
      i_l=0;
      delay(52000);

      }
      }

      Raspberry Pi modtager fra Arduino Uno via USB (Python):

      #!/usr/bin/python
      import serial
      import csv
      import sys
      import time

      # definere variabler
      baudrate = 9600
      indgang = '/dev/ttyACM0'
      sted = '/home/pi/Drivhus/'

      # Minuttet der startes
      tid_g = int(time.strftime("%M"))

      # Data input
      ser = serial.Serial(indgang,baudrate)

      # loop
      while 1:

      # Det insamles 4 data, saa er jeg sikke paa at alle tre data
      # er insamlet, sortere data
      for x in range(0, 4):
      data = int(ser.readline())

      # finder temperatur
      if data = 100:
      temp_ok = data - 200

      # finder luftfugtighed
      if data = 399:
      hum = data - 400

      # finder sollys
      if data = 599:
      lys = data - 600

      # Klar til at skriver data til csv fil hvis de er ok!

      # find minuttet
      tid_m = int(time.strftime("%M"))

      # hvilken dag er det
      dag= time.strftime("%A")

      # tjekker om det er paa tide at gemme data
      if tid_m > tid_g:
      tid_g = tid_m
      if tid_g == 59:
      tid_g = -1

      # klokslet der skrives i CSV filen
      tid = time.strftime("%H:%M")

      # samler de forskellige data i en string
      data = [tid,temp_ok,hum,lys]

      # aabner CSV filen saa der kan skrives i den
      with open(sted + dag +'.csv','wb') as fp:
      a = csv.writer(fp)

      # skriver data til filen og lukker den
      a.writerow (data)
      print 'Data gemmes ', data, ' Klokken er ', tid
      del data
      fp.close()

    • #9052
      hni
      Medlem

      Hmm. Link virker ikke, jeg prøver lige noget andet:

      Og nu lidt link:

      Første sender i drivhuset:

      Færdig sender i drivhuset:

      Første modtager:

      Snyde hjemmeside:

    • #9054
      hni
      Medlem
    • #9058
      mhn
      Medlem

      Spændende projekt. 🙂

      Hvorfor har du valgt Attiny 85 i stedet for en lille Arduino?

      Mvh
      Morten

    • #9062
      hni
      Medlem

      Hej Morten!

      Fordi at en Attiny85 koster nul og en kiks.
      Den kan klare opgaven og jeg skal ikke bruge så meget strøm.

      Senderen i drivhuset er ikke laves så den spare på strømmen, men den bruger også kun 10 mA.
      Solcellen giver op til 1,5w så der er rigeligt med strøm til at drive den og lade batteriet op med.

      Modtageren:
      Raspberry Pi bruger vel omkring 1A og en Arduino, ja det ved jeg ikke, men Raspberry Pi er ikke helt glad for at drive den med modtageren, så det er grunden til at der også kommer en Attiny85 på.

    • #9082
      mhn
      Medlem

      Jeg har en flere år gammel ½ plan om sådan en drivhus dims, så jeg er ret nysgerrig. 🙂

      Hvad er det for en solcelle, du bruger?

      En lille Arduino er heller ikke nogen stor udskrivning. 🙂 Men det er muligt, den bruger en del mere strøm. http://www.ebay.com/itm/New-Pro-Mini-atmega328-5V-16M-Replace-ATmega128-Arduino-Compatible-Nano-/200957063666?pt=LH_DefaultDomain_0&hash=item2ec9f971f2

      Hvad coder du Attiny85 med? Kan den bruge Arduino miljøet?

      Mvh
      Morten

    • #9085
      hni
      Medlem

      Hej Morten!

      Solcellen er en:
      http://www.biltema.dk/da/Bil—MC/Bil-tilbehor/Bil-el/12-Volt/Solcellepanel-31630/

      Jeg har også set den i Harald Nyborg

      Jo, den bliver programmeret i Arduino IDE
      Du kan gøre følgende:

      How to program ATTiny85 with Arduino Uno (part 1)

      Jeg kan ikke lige huske hvad en Attiny85 koster, det er omkrint 10-15kr. hos RS.

    • #9099
      mhn
      Medlem

      Hej.

      Tak for linkene. 🙂

      Men kan få 5 Attiny85 på ebay for en 50er i hvert fald.

      Mvh
      Morten

Viser 7 svartråde
  • Du skal være logget ind for at svare på dette indlæg.