Mät projekt
Temperatur ÖVERKALIX
1-Wire / Raspberry Pi

INDEX
  • Inledning
  • senast uppdaterat
  • beskrivning
    - 1-Wire via I2C
    - OWFS
    - 1-Wire via 1W-GPIO
    - 3G / HSDPA Modem
    - SSH Tunnel över 3G / HSDPA
  • Referenser / Länkar m.m.
  • 'Disclaimer'

    Aktuella mätdata från systemet:
  • Inledning
    Använder en 'bunt' med Raspberry Pi datorer tillsammans med 1-Wire temperatur sensorer Dallas / Maxim DS18S20, samlar in och logga temperaturdata från en rad platser runt om inom Överkalix Kommun.

    Resultatet skickas upp med sftp till en Linux server där temp data loggas och presenteras i 'snygga' grafer.


    1-Wire + RPI
    Senast uppdaterat
    2017.01.15 Senaste tillskottet är Kälvjärv / Överkalix - Mät datorn är igång sedan 2017.xx.xx

    Skapade en sida så att man kan hålla koll på senaste avläsningen (För att se att allt är igång) -->
    Senast avläst..

    Beskrivning
    Varje Raspberry Pi dator är 'grund' installerad med OS 'raspbian-jessie-lite' + drivrutiner för I2C interface eller 1W-GPIO avläsning, använder två små script för avläsning och uppladdning av temp data med sftp/ssh.

    Började med att använda ett I2C interface och OWFS. Har på senare tid övergått till att koppla 1-Wire direkt till GPIO och kör i stället 'modprobe w1-gpio' - Båda metoderna beskrivs här nedan.

    1-Wire via I2C
    Använder ett I2C till 1-Wire interface som jag inhandlat från m.nu[L2], använder OWFS paketet för att avläsa I2C bussen.


    RPI med I2C interface och 3G / HSDPA modem


    RPI med I2C interface

    Kör raspi-config för att aktivera SSH och I2C.

    
    $ sudo raspi-config
    
    Välj '7. Advanced Options'
    Välj 'A4 SSH' och aktivera 'SSH'
    
    Välj '7. Advanced Options'
    Välj 'A7 I2C' och aktivera 'I2C'
    
    Välj att avsluta 'Exit' och starta om din RaspberryPi
    

    Logga in och byt lösenord för användaren 'pi' med kommando, 'sudo passwd pi'

    
    $ sudo passwd pi
    

    Du kan nu logga in 'remote' med 'ssh' och en terminal klient t.ex. 'pytty' till din RaspberryPi

    Kolla lokal LAN IP-Adress på din raspberryPi (Interface=eth0) med kommando 'ifconfig'

    
    $ ifconfig
    

    Lägga in stöd för att använda I2C interface - Redigera modules config /etc/modules

    
    $ sudo nano /etc/modules
    

    Skriv in två rader längst ner i modules filen(Om dom saknas)

    
    i2c-bcm2708
    i2c-dev
    

    Redigera startup config med kommando, 'sudo nano/boot/config.txt'

    
    $ sudo nano /boot/config.txt
    

    Skriv in två rader längst ner i config.txt filen(Om dom saknas)

    
    dtparam=i2c1=on
    dtparam=i2c_arm=on
    

    Starta om din raspberryPi med 'sudo reboot'

    
    $ sudo reboot
    

    Nu är det dax att kolla om I2C bussen och interfacet fungerar.
    Lägg till i2c-tools paketet med bl.a. i2cdetect. (I detta läge krävs att din RaspberryPi har en fungerande internet anslutning via LAN eller 3G / HSDPA)

    
    $ sudo apt-get install i2c-tools
    

    När installationen är klar så är det bara att testa, kör 'sudo i2cdetect -y 1' - Om allt är OK så syns 1-Wire master enheten som I2C ID# 1b eller 18

    
    $ sudo i2cdetect -y 1
    
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00:          -- -- -- -- -- -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- 1b -- -- -- --
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    70: -- -- -- -- -- -- -- --
    

    OWFS
    Så är det dax att installera och testa OWFS paketet (I detta läge krävs att din RaspberryPi har en fungerande internet anslutning via LAN eller 3G / HSDPA)

    
    $ sudo apt-get install owfs 
    

    Skapa en katalog för avläsning av 1-Wire data.

    
    $ sudo mkdir /mnt/1wire
    

    Redigera filen /etc/fuse.conf

    
    $ sudo nano /etc/fuse.conf
    

    I filen ska det finnas en rad där det står 'user_allow_other' Lägg till / editera raden (Ta ev. bort # tecknet eller skriv in hela raden)

    
    user_allow_other
    

    Så är det dax att testa, hoppa till katalogen /mnt/1wire/ (Använd kommando 'cd') - Lista innehållet (kommando ls), där ligger nu en massa kataloger.

    
    $ sudo /usr/bin/owfs --i2c=ALL:ALL --allow_other /mnt/1wire/
    
    $ cd /mnt/1wire/
    
    $ ls
    
    05.4AEC29CDBAAB  28.FF8332A81503  bus.0  settings      statistics  system
    10.67C6697351FF  alarm            bus.1  simultaneous  structure   uncached
    

    I katalogen med namnet '28.*' ligger en fil som heter temperature, printa den med kommandor 'cat' - Om du har flera DS18S20 sensorer på din 1-wire buss så listas flera 28.* kataloger, en per sensor (Den faktiska Sensor adressen ligger i filen 'address' i respektive katalog)

    
    $ cat 28.*/temperature
    21.125
    

    Lägg in ett start script i /etc/init.d för att starta tjänsten 'owfs' vid uppstart.

    
    $ sudo nano /etc/init.dstart1wire.sh
    

    Skriv in följande i filen /etc/init.dstart1wire.sh

    
    #!/bin/bash
    
    ### BEGIN INIT INFO
    # Provides:          start1wire
    # Required-Start:    $local_fs $syslog
    # Required-Stop:     $local_fs $syslog
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: Start OWFS at boot time
    # Description:       Start OWFS at boot time
    ### END INIT INFO
    
    # Starts OWFS
    /usr/bin/owfs --i2c=ALL:ALL --allow_other /mnt/1wire/
    

    Starta om din RaspberryPi med 'sudo reboot' - Efter uppstart, logga in igen och kontrollera att tjänsten 'OWFS' är igång med kommando 'pstree'


    Nu är det bara att kopiera ut temperatur data och skicka upp det till en display eller en webb-sida (Beroende på hur temperatur data ska användas) - Mina 'upload' script ligger längre ner på sidan

    1W-GPIO
    Att hämta in 1-wire data via 1w-gpio är nästan lika enkelt

    Först måste vi läsa in drivarna, enklast är med kommando
    
    sudo modprobe w1-gpio
    sudo modprobe w1-therm
    

    Editera /boot/config.txt för att starta drivarna när din raspberry startar upp Lägg till längst ner i filen /boot/config.txt

    
    modprobe w1-gpio
    modprobe w1-therm
    

    Läs ut 1-wire data - 1-Wire data hamnar i filen /sys/bus/w1/devices/28-xxxxxxxxxxxx/1w_slave

    
    $ cat w1_slave
    fd ff 4b 46 7f ff 03 10 8d : crc=8d YES
    fd ff 4b 46 7f ff 03 10 8d t=-187
    

    Använder ett python script för att läsa ut 1-wire data, startar scriptet med ett shell script och en 'pipe' från stdout till en fil.

    
    # get-temp.py
    # Open the file that we viewed earlier so that python can see 
    # what is in it. Replace the serial number as before.
    tfile = open("/sys/bus/w1/devices/28-000006226d38/w1_slave")
    # Read all of the text in the file.
    text = tfile.read()
    # Close the file now that the text has been read.
    tfile.close()
    # Split the text with new lines (\n) and select the second line.
    secondline = text.split("\n")[1]
    # Split the line into words, referring to the spaces, 
    # and select the 10th word (counting from 0).
    temperaturedata = secondline.split(" ")[9]
    # The first two characters are "t=", so get rid of those 
    # and convert the temperature from a string to a number.
    temperature = float(temperaturedata[2:])
    # Put the decimal point in the right place and display it.
    temperature = temperature / 1000
    print temperature
    

    Kör ett shell skript för att starta python skriptet och för att läsa ut aktuell tid till en fil.

    
    # get-temp.sh
    #!/bin/bash
    # Kopiera aktuell temperatur till en fil
    sudo python /home/pi/get-temp.py > /home/pi/data/aktell_temp.txt
    # Kopiera aktuell tid till en fil
    date "+DATE: %m/%d/%y TIME: %H:%M:%S" > /home/pi/data/aktuell_tid.txt
    

    Ref 1w-gpio = http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/temperature/


    RPI med LAN koppling & 1W-GPIO interface

    3G / HSDPA Modem & Sakis3G
    På några mätplatser använder vi begagnade 'HUAWEI E220' 3G / HSDPA / GPRS modem. Dom är väldigt enkla att configurera och använda.

    Kör 'update' och installera sedan 'ppp' & libusb-dev på din RaspberryPi.

    
    $ sudo apt-get update
    $ sudo apt-get install ppp libusb-dev
    

    Ladda ner och packa upp 'Sakis3G' script för att hantera / configurera 3G / HSDPA kopplingen, kopiera in script filen i /etc/init.d/ katalogen och ändra så att den blir körbar med 'chmod +x'

    
    $ wget "http://raspberry-at-home.com/files/sakis3g.tar.gz"
    $ sudo tar -zxvf sakis3g.tar.gz
    $ sudo cp sakis3g /etc/init.d/
    $ sudo chmod +x /etc/init.d/sakis3g
    

    Du kan starta och testa 'sakis3g' manuellt med kommandot

    
    $ ./sakis3g --interactive
    

    För att köra modem uppkopplingen automatiskt vid uppstart skapar du en config fil '/etc/sakis3g.conf' ...

    
    $ sudo nano /etc/sakis3g.conf
    
    #Telia (online.telia.se)
    APN=online.telia.se
    
    # TDC (internet.se)
    # APN=internet.se
    
    # Tele2
    # APN=mobileinternet.tele2.se
    
    # Halebop
    # APN=halebop.telia.se
    
    # om kortet har en PIN-kod så anger du den här
    # SIM_PIN=0000
    
    # Raspberry PI använder sig av sudo utan lösenord, konfigurera
    # så att sakis3g använder det när det behövs
    alwayssudo
    

    ...Och lägger in 'sakis3g' i rc.d startup med kommando

    
    $ sudo update-rc.d sakis3g start 2 3 4 5
    
    Om allt fungerar som det ska så kan man se en 'ppp' interface när man kör kommandet 'ifconfig'

    
    ppp0      Link encap:Point-to-Point Protocol
              inet addr:100.64.225.31  P-t-P:10.64.64.64  Mask:255.255.255.255
              UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
              RX packets:7 errors:0 dropped:0 overruns:0 frame:0
              TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:3
              RX bytes:325 (325.0 B)  TX bytes:333 (333.0 B)
    

    Med kommandot 'sudo ./sakis3g --interactive' kan man hantera sin 3G / HSDPA anslutning manuellt, bl.a. kan man se status på anslutningen


    Sakis3g status skärm

    SSH Tunnel över 3G / HSDPA
    Kör ett par Raspberry Pi med 3G / HSDPA/GPRS nät (Mobil-Nät), operatören (Telia-Sonera) tillåter utgående trafik på SSH port 22, men inte inkommande?! - Löser problemet genom att öppna en SSH session från Raspberry Pi sidan (Fjärr datorn) till servern på port 22, dirigerar om till en oanvänd port på server sidan.

    För att kunna föra över temp data filer till en server automatiskt med ett script & sftp/ssh krävs att du kan autentisera automatiskt, det gör du med hjälp av ett Public/private nyckel par. Börjar med att skapa ett ssh nyckel par på den lokala maskinen (RaspberryPi klient dator) med kommandot 'ssh-keygen'

    
    $ ssh-keygen
    

    Följ istruktionen på skärmen, Kopiera över den lokala maskinens publika nyckeln till servern med kommandot 'ssh-copy-id' - Byt ut 'user@remotehost.com' i kommandot mot dina inloggnings uppgifter för servern.

    
    $ ssh-copy-id -i ~/.ssh/id_rsa.pub user@remotehost.com
    

    Prova att logga in med ssh

    
    $ ssh user@remotehost.com
    

    Startar och kontrollerar ssh tunneln med ett shell script 'start_tunnel.sh' som körs i crontab

    
    #!/bin/bash
    createTunnel() {
      /usr/bin/ssh -N -R 2222:localhost:22 user@remotehost.com
      if [[ $? -eq 0 ]]; then
        echo Tunnel to jumpbox created successfully
      else
        echo An error occurred creating a tunnel to jumpbox. RC was $?
      fi
    }
    /bin/pidof ssh
    if [[ $? -ne 0 ]]; then
      echo Creating new tunnel connection
      createTunnel
    fi
    

    Sedan är det bara att ansluta från server sidan med kommandot nedan, byt ut 'pi_user' till användarnamnet du har i din Raspberry Pi.

    
    $ ssh -p 2222 pi_user@localhost
    


    Kopiera ut temp data och ladda upp till server med två shell script, dom körs också men crontab
    
    $ cat copydata.sh
    #!/bin/bash
    # Script 1 - Kopiera 1-wire data till /home/pi/data/ katalogen
    #
    cp /mnt/1wire/28.B071CE020000/temperature /home/pi/data/temp.txt
    date "+DATE: %m/%d/%y TIME: %H:%M:%S" > /home/pi/data/tid.txt
    
    $ cat upload.sh
    #!/bin/bash
    # Script 2 - Ladda upp innehållet i /home/pi/data/ till server med ssh/sftp
    sleep 5
    sftp user@remotehost.com <

    Starta skripten var tredje minut med crontab, kör även kontroll av 3G / HSDPA / ssh-tunnel koppling varje minut.

    
    $ crontab -e
    
    */3 * * * * sudo /home/pi/copydata.sh
    */3 * * * * /home/pi/upload.sh
    */1 * * * * /home/pi/start_tunnel.sh > /home/pi/tunnel.log 2>&1
    


    Länkar / Leverantörer / Referenser
    Honors to the brains behind - 'Äras den som äras bör' - som talesättet säger. Som vanligt så är det inte jag som kommit på allt detta. Här hittar ni länkar till referenser och leverantörer.

    Leverantörer:
    [L1] biltema.se
    [L2] m.nu
    [L3] electrokit.se
    [L4] kjell.com

    Länkar / Referenser:
    [R1] SSH tunnel config https://www.tunnelsup.com/raspberry-pi-phoning-home-using-a-reverse-remote-ssh-tunnel/
    [R2] https://wiki.m.nu/index.php/OWFS_p%C3%A5_Rasperry_Pi#Testa_installationen
    [R3]


    'Disclaimer'
    The information given on this page is given on an 'As Is' basis and aimed for NON COMMERCIAL use only. The author can not be held responsible for any use of the information. Any registered product / trademark or company name on the page is the property of their respective owners.

    Notera!
    Det är helt personliga reflektioner och upplevelser vi skriver om på den här sidan, dessa är inte några 'Expert' kommentarer / utlåtanden. Vi rekommenderar INTE att någon ska göra dom ändringar / Modifieringar som vi gjort och som beskrivs på denna sida, då dessa HELT SÄKERT gör att alla garantier som leverantören utställt OMEDELBART upphör.

    Våra tester och slutsatser kan INTE, och ska INTE tas för intäkt att samma eller motsvarande resultat eller upplevelse kan erhållas eller efterliknas någon annanstans eller av någon annan.




    Go Back!


    ©2010 SM2YER Goran