Raspberry Pi Webshop › Fora › Projekter › Data opsamling fra drivhus
- Dette emne har 7 svar og 2 stemmer, og blev senest opdateret for 9 år, 6 måneder siden af
mhn.
- ForfatterIndlæg
- 31. maj 2014 kl. 14:16 #9050
hni
MedlemHej 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()
- 31. maj 2014 kl. 14:35 #9052
hni
Medlem - 31. maj 2014 kl. 17:38 #9054
hni
MedlemOk, det virkede heller ikke
Så undskyld, de kommer som tekst:https://dl.dropboxusercontent.com/u/13309179/Drivhus/Sender%201%20i%20drivhuset.jpg
https://dl.dropboxusercontent.com/u/13309179/Drivhus/Sender%201%20i%20drivhuset-1.jpg
https://dl.dropboxusercontent.com/u/13309179/Drivhus/Modtager%201%20i%20viktualierumet.jpg
https://dl.dropboxusercontent.com/u/13309179/Drivhus/Sender%202%20i%20drivhuset.jpg
https://dl.dropboxusercontent.com/u/13309179/Drivhus/Sender%202%20i%20drivhuset-1.jpg
https://dl.dropboxusercontent.com/u/13309179/Drivhus/Sender%202%20i%20drivhuset-2.jpg
https://dl.dropboxusercontent.com/u/13309179/Drivhus/Drivhus-html.png
- 1. juni 2014 kl. 08:34 #9058
mhn
MedlemSpændende projekt. 🙂
Hvorfor har du valgt Attiny 85 i stedet for en lille Arduino?
Mvh
Morten - 1. juni 2014 kl. 13:51 #9062
hni
MedlemHej 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å. - 3. juni 2014 kl. 08:01 #9082
mhn
MedlemJeg 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 - 3. juni 2014 kl. 16:42 #9085
hni
MedlemHej 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:Jeg kan ikke lige huske hvad en Attiny85 koster, det er omkrint 10-15kr. hos RS.
- 5. juni 2014 kl. 08:37 #9099
mhn
MedlemHej.
Tak for linkene. 🙂
Men kan få 5 Attiny85 på ebay for en 50er i hvert fald.
Mvh
Morten
- ForfatterIndlæg
- Du skal være logget ind for at svare på dette indlæg.