Temperatur sensor

I dette projekt er der brugt en digital temperatur måler tilkoblet en Raspberry PI.

I projektet er der brugt:
Raspberry PI 3
DS18B20 Temperatur Sensor

Afsnit 1: Opsætning

Projektet som denne tutorial er baseret på er opsat som følgende:

1. Der skal i command prompten, indtastes:

sudo nano /boot/config.txt

så skal der i bunden af files indsættes:

dtoverlay=w1–gpio 

2. Luk Nano, and genstart Pi’en

sudo reboot

3. Log ind i Pi igen, og igen i the command prompten indtastes:

sudo modprobe w1–gpio 

4. indtast så:

sudo modprobe w1-therm 

5. skift standard path til /sys/bus/w1/devices path’en ved at indtaste:

 cd /sys/bus/w1/devices 

6. tilføj så ls til listen af moduler ved at indtaste:

ls

det giver et display som skal have et formatet:
28-XXXXXXXXXXXX med X værende modulets variable identifikations værdig

7. indtast så cd 28-XXXXXXXXXXXX (skift X til værdien du har fået oplyst)

8. indtast

cat w1_slave

det promter et display en en temperaturmåling i rå data givet af sensoren, den specifikke temperatur er givet ved t=xxxxx, formatet skal ses som xx,xxx grader celsius

Afsnit 2: Automatisk måling med logfil

import os 
import glob 
import time 
from time import * 

os.system('modprobe w1-gpio') 
os.system('modprobe w1-therm') 

base_dir = '/sys/bus/w1/devices/' 
device_folder = glob.glob(base_dir + '28*')[0] 
device_file = device_folder + '/w1_slave' 
 

def read_temp_raw(): 
   f = open(device_file, 'r') 
   lines = f.readlines() 
   f.close() 
   return lines 

def read_temp(): 
  lines = read_temp_raw() 
  while lines[0].strip()[-3:] != 'YES': 
    time.sleep(0.2) 
    lines = read_temp_raw() 
  equals_pos = lines[1].find('t=') 
  if equals_pos != -1: 
    temp_string = lines[1][equals_pos+2:] 
    temp_c = int(temp_string) / 1000.0 
    temp_c = str(round(temp_c, 1)) 
    return temp_c 

def write_temp(): 
    with open("/home/pi/temp.csv", "a") as log: 
        log.write("{0},{1}\n".format(strftime("%d-%m %H:%M"), read_temp())) 
while True: 
    write_temp()  
    print(read_temp()) 
    sleep(150) 

overstående stykke kode er et python program som har funktionen at måle sensorens temperatur hvert tredje minut og derefter nedskrive det i en csv fil på en forbestemt path. målingerne har en følgende struktur:

Afsnit 3: Graf

import dash  
import dash_core_components as dcc 
import dash_html_components as html 
import csv 
import sys 

with open('temp.csv') as csv_file: 
    reader = csv.reader(csv_file, delimiter=',') 
mylist = list(reader) 
    x={} 
    y={) 
    z=[] 
    xy=[] 
for i in range(len(mylist)): 
    f = str(mylist[i]) 
    space = ' ' 
    str4f = f.replace("[","").replace("]","").replace("'","").replace(",","").replace(" ","/") 
    x[i] = str4f[:str4f.index("/")] 
    y[i] = str4f[str4f.index("/")+1:str4f.rindex("/")] 
    z.append(float(str4f[str4f.rindex("/")+1:])) 
    xy.append(str4f[:str4f.index("/")] + space + str4f[str4f.index("/")+1:str4f.rindex("/")])  
app = dash.Dash() 
app.layout = html.Div(children=[  
    html.H1(children='Temperatur'), 
     dcc.Graph( 
        id='example', 
        figure={ 
            'data': [ 
                {'x': xy, 'y': z, 'type': 'line', 'name': 'Temps'},      
            ], 
            'layout': { 
                'title': 'Temperatur målinger' 
            } 
        } 
    ) 
]) 
if __name__ == '__main__': 
    app.run_server(debug=True)

Ved brug af førnævnte csv fil, som indeholder logget data, læses værdierne. Derefter bruges kodestykket: for i in range(len(mylist)): til at konvertere strukturen af de førnævnte værdier, så de er konvertible med Dash.
Dash er et python framework der er bruges til at lave grafer. Til sidst definer vi ud fra dash’ forudbestemte muligheder udseendet og lader dash danne grafen på en html side.

Miljø sensor

Arduino miljø sensor er teknologier bestående af Python og Arduino.

I dette projekt er der brugt:
MKR1000
KY-028

Afsnit 1: Installation

Hvis det er første gang MKR1000 modulet bliver er i brug på din pc skal der installeres nogle drivere, det plejer Arduino IDE at prompte hvis det er åbent når forbindelsen startes.

Derefter skal der hentes et library fra package manager kaldet “Wifi101”

Afsnit 2: Wifi

Når drivere og library er sat op kan vi nu påbegynde programmerings delen.

MKR1000 bliver forbundet til SKP2.4GHz da informationen fra MKR modulet skal hentes fra en python client:

char pass[] = “SSID password”;
char ssid[] = “Chosen SSID”;

while (WiFi.begin(ssid, pass) != WL_CONNECTED)
{
Serial.println(“reconnecting… “);
delay(2000);
}


Med denne code snippet kan vi registrere om Arduino modulet er forbundet til internettet.

Afsnit 3: Data

For at få fat i KY-028 data skal vi få Arduino modulet til at læse det’s input.

int intNavn analogRead(Pin hvor sensor input er)


Denne linje vil give input fra KY modulet, og så er man klar til at filosofere over problemløsninger.

Projektet som denne tutorial er baseret på:

Arduino kode:

#include <WiFiUdp.h>
#include <SPI.h>
#include <WiFi101.h>

unsigned int localPort = 2396;

int status = WL_IDLE_STATUS;
int sensorPinTemp = A0;
int sensorPinLight = A1;
int sensorValue_temp = 0;
int fixInput = 560; 

float i = 0;
float fixtemp = 20.0;
float fixedDegreeValue = 5.5;

char packetBuffer[255];
char pass[] = "SSID password";
char ssid[] = "Chosen SSID";

WiFiUDP Udp;

void setup ()
{
  Serial.begin (9600);
  pinMode(13, OUTPUT);
}

void loop () 
{
  if (WiFi.status() != WL_CONNECTED) 
  {
    digitalWrite(13, LOW);
    while (WiFi.begin(ssid, pass) != WL_CONNECTED) 
    {
      Serial.println("reconnecting... ");
      delay(2000);
    }
    Serial.print("Connected to ");
    Serial.println(WiFi.SSID());
    wifiStatus();
  }
  
  sensorValue_temp = analogRead(sensorPinTemp);
  
  int packetSize = Udp.parsePacket();
  if (packetSize) 
  {
    Serial.print("From ");
    IPAddress remoteIp = Udp.remoteIP();
    Serial.print(remoteIp);
    Serial.print(", port ");
    Serial.println(Udp.remotePort());
    
    int len = Udp.read(packetBuffer, 255);
    if (len > 0) 
    {
      packetBuffer[len] = 0;
    }

    i = fixInput - sensorValue_temp;
    i = i /fixedDegreeValue;
    Serial.print("Temperature: ");
    fixtemp = fixtemp + i;
    
    String tempString = String(fixtemp);
    char tempChar[10];
    tempString.toCharArray(tempChar, 10);
    
    Serial.print(tempString);
    Serial.println();
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(tempChar);
    fixtemp = 20;
    Udp.endPacket();
  }
  delay(1000);
}

void wifiStatus()
{
  IPAddress ipv4 = WiFi.localIP();
  Serial.print("Arduino IP: ");
  Serial.println(ipv4);
  Udp.begin(localPort);
  digitalWrite(13, HIGH);
}

Python kode:

import sys
import time
import _thread
from socket import *
import tkinter as tk


address = ('192.168.1.69', 2396)
client_socket = socket(AF_INET, SOCK_DGRAM)
client_socket.settimeout(1)


def arduino_conn():
    data = "0"
    try:
        client_socket.sendto(str.encode(data), address)
        rec_data, addr = client_socket.recvfrom(2048)
        data_recived = str(rec_data)
        udp_temp_string = data_recived[data_recived.index('\'') + 1:]
        udp_temp_string = udp_temp_string.replace("\'", "")
        #print(udp_temp_string + " °C")
        return udp_temp_string
    except Exception as e:
        print(e)
        pass


class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets()
        #self.get_temp()


    def create_widgets(self):
        self.temp = tk.Label(self, text="00.00°C", fg="red")
        self.temp.config(font=("Courier", 70))
        self.temp.pack(side="bottom")
        _thread.start_new_thread( self.get_temp,())
        
    def get_temp(self):
        while 1:
            try:
                self.temp['text'] = arduino_conn()+ "°C"
                time.sleep(3)
            except Exception as e:
                print(e)
                pass
        

root = tk.Tk()
app = Application(master=root)
app.mainloop()



IoT Holland

Jeg har været i Holland i 4 uger, hvor jeg har arbejdet med et IoT projektet og igennem denne her blog vil jeg fortælle om min oplevelser og hvad jeg har lært.

Lidt om mig

Før vi går i dybden, med alt det jeg har lavet og den slags, vil jeg fortælle noget om mig selv. Vi kan starte med mit navn, jeg hedder Johannes og er 17 år gammel, jeg går på Aarhus Tech som EUX datatekniker elev med speciale i programmering og på tidspunktet, hvor jeg skriver det her, har jeg været på skolen i let over 1.5 år og er lige nu i SKP.

Hvordan/Hvorfor

Som jeg har sagt går jeg i SKP, og når man går i SKP kan man komme ud og rejse gratis eller næsten, da skolen betaler for flyet og bolig, men du skal selv betale for mad og sjov.

 Skolen ordner også det med den anden skole hvor du skal gå i den tid hvor du er væk.

Det er jo alt sammen godt, men Hvorfor tog jeg af sted, væk fra mor og far, væk fra trygge rammer og væk fra Danmark især nu når ”racen” kendt som IT Elever er bange for sol og andre mennesker.

 Godt spørgsmål, mine grunde er for at blive bedre til engelsk, fordi alt foregår på engelsk hvis du ikke havde gættet det og det er en god måde at gøre det på, en anden grund til at jeg tog afsted er meget simpel, at jeg bare gerne vil rejse, det bliver ikke mere simpelt end det, men den vigtigste grund til at jeg tog af sted er at jeg vil godt finde ud af hvordan det er at arbejde i et andet land og hvordan det er arbejde med folk som du ikke har mødt før.

Projektet

Men nok mig du er ikke kommet her for at læse om mig men for at læse om projektet så hvad går det så ud på for det må jo være et stort projekt siden det tog en hel måned, vores opgave var at vi 4 elever to fra Holland og to fra Danmark skulle lave et system til ham her svampefaren som hedder Patrick, som ejer et firma da laver gourmet svampe (Kwekersgilde) fra kaffegrums.

 Hvad skulle det her så kaldt system kunne gøre? Det skulle gøre mange ting, men overordnede skulle det kunne tage oplysninger fra svampene, temperaturen, Co2 niveau og fugtigheden.

 De tre oplysninger skulle sendes til en server, hvorefter serveren skulle gemme de oplysninger, og finde ud af om de skulle Fx.

 Skrues op for varmen og så videre, så med andre ord skulle det her system kontrollere næsten alt da har noget med svampens levevilkår, og samle data om dem.

 Hvordan gjorde vi så det, vi klarede opgaven ved at tage en Raspberry pi, som vi så gjorde til en server.

 Den måde vi gjorde den til en server var ved at installere noget som hedder Domoticz, og hvad er det så? tænker du nok.

 Domoticz, er et program som du installer på en computer, og det er lavet til hjemme automatisering, sådan noget med sensorer, dataindsamling, sikkerhed, og den slags ting.

 Da vi havde fået Domoticz op og køre, tilsluttede vi nogen ESP´er, en ESP er en lille Wi-Fi chip, på ESP’en installerede vi noget som hed ESPeasy og det program gør at vi kan tilslutte ESP´erne til Domoticz.

 Men hvorfor skulle tilslutte nogle ESP´er til vores system?

Det er fordi at vi ikke bare kunne tilslutte nogle sensorer direkte til Domoticz, så derfor skulle vi have en mellem mand.

 Og så tilsluttede vi 3 sensorer til vær af ESP´erne, så 2 af ESP´erne havde 1 temperaturen sensor, 1 Co2 og 1 fugtigheds sensorer, og alt det kom ned i 2 små kasser.

 Vi skulle også sætte et netværk op, så vi kunne sende data til Domoticz, så det gjorde vi også fra bunden.

 Inde på Domoticz programmerede vi alt så temperaturen, Co2 niveau og fugtigheden passet til svampenes levevilkår og der efter var vi næsten færdige, vi skulle bare installer en app på Patricks mobil så han kunne se hvad da sker i hans farm slev når han ikke er der.

 Det er Ca. det vi lavede, dette er godt nok et forkort version af det for hvis jeg skulle skrive det hele ned vil jeg ikke være færdig nu.