Raspberry PI serial Arduino to Graphite ds18b20

Blanda saman Arduino og Raspberry pi.

Byggt á þessari lausn

Lesa með serial frá Arduino þar sem hann er að skila upplýsingum um hitastig.

Gögnin eru lesin af serial og skilað inn í Graphite log server.

Fyrst er Graphite sett upp á Raspberry Pi, leiðbeiningar hér.

Síðan þarf að breyta aðeins stillingum í Raspberry pi svo serial portið sé laust fyrir samskipti.

Opna skránna /etc/inittab og setja # fyrir framan T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

Opna skránna /boot/cmdline.txt og eyða út console=ttyAMA0,115200

Reboot og vélin er tilbúin til að hafa serial samskipti.

Næst er að setja inn sketch á Arduino sem skilar út gildum á serial, ég notaði sama sketch fyrir arduino í HC-05 verkefninu

Svo tengja þetta upp.

Best er að nota logic level converter til að tengja saman þessi tæki þar sem passa þarf að Ardunio er með 5V á serial samskiptum og Raspberry pi með 3.3V þannig það þarf að vernda GPIO á raspberry pi. 

 

En ákveðið var að notast við voltage Divider og þá þarf að passa að setja ekki sketch inn á arduino með hana tengda við raspberry pi.

Uploda sketch fyrst, tengja svo. ( en þetta er samt varhugavert..)

Notast er við 2x viðnám 1.2K og 2.2K til að framkvæma þann hluta, sést á mynd.

arduino-raspberrypi

Koma gildum inn í graphite.

Notast var við python kóða héðan með smá breytingum.

Breyta þarf carbon server í ip addressu á raspberry pi.

Setja # fyrir framan msg.append("%s.humidity %s %d" % (prefix, cols[1], now))

Þar sem ds18b20 er notaður.

Breyta msg.append("%s.temp %s %d" % (prefix, cols[4], now)) í msg.append("%s.temp %s %d" % (prefix, cols[8], now))

Svo réttur dálkur sé lesinn sem inni heldur hitastigið.

Keyra skránna með python kóðanum og gildin eru farin að safnast saman í graphite.

gildi

 

Ef engin gögn skila sér er gott að testa serial samskiptin með þessum python kóða.

Þegar hann er keyrður eiga gildin frá arduino að sjást.

import serial
ser = serial.Serial('/dev/ttyAMA0', 9600, timeout=1)
ser.open()

ser.write("testing")
try:
        while 1:
                response = ser.readline()
                print response
except KeyboardInterrupt:
        ser.close()

 

 

Dallas Temperature library fyrir Arduino er fengið héðan

Arduino kóðinn.

 

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
}

void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  
  Serial.print("Temperature for the device 1 (index 0) is: ");
  Serial.println(sensors.getTempCByIndex(0));  
}

 

 

Python Kóðinn breyttur

 

import argparse
import serial
import string
import time
import os, sys
from socket import socket

CARBON_SERVER = '192.168.1.183'
CARBON_PORT = 2003

DEFAULT_SERIAL="/dev/ttyAMA0"
DEFAULT_PREFIX="garage.1"


parser = argparse.ArgumentParser()
parser.add_argument('--serial', help='Serial device to read data')
parser.add_argument('--prefix', help='String prefix used for metric key')

args = parser.parse_args()
if args.serial is None:
  serial_port = DEFAULT_SERIAL
else:
  serial_port = args.serial

if args.prefix is None:
  prefix = DEFAULT_PREFIX
else:
  prefix = args.prefix


print serial_port
print prefix

ser = serial.Serial(serial_port, 9600)

sock = socket()
try:
    sock.connect( (CARBON_SERVER,CARBON_PORT) )
except:
    print "Couldn't connect to carbon server %(server)s :: %(port)d." % { 'server':CARBON_SERVER, 'port':CARBON_PORT }
    sys.exit(1)

while 1:
    msg = []
    line = ser.readline()
    now = int (time.time() )
    print line
    if len(line.split()) >= 3:
      cols = line.split()
      print cols
#      msg.append("%s.humidity %s %d" % (prefix, cols[1], now))
      msg.append("%s.temp %s %d" % (prefix, cols[8], now))
      message = '\n'.join(msg) + '\n'
      print '-' * 80
      print message
      print
      sock.sendall(message)