eMag

sâmbătă, 12 martie 2011

Arduino + 2xDS18B20 + pachube - continuare

   Dupa un timp de "inactivitate" iata ca reusesc sa mai scriu ceva,
   Daca nu am scris nu inseamna ca nu am facut nimic....., am facut si inca multe. ;)
   Pentru inceput am modificat sistemul de monitorizare al temperaturii din casa si din fata geamului. :).

   Treaba cu serverul ala de linux nu prea se merita dpdv energetic, pentru un script de py care rula acolo il tineam pornit 24/24, cei drept nu consuma mult dar consuma. A trebuit sa pun in aplicare planul B.

   PLANUL B.

   "Super" ROUTERUL meu cu DD-WRT (Asus WL-500P), el poate sa "tina" scripturile, dar deja tinea cam multe si nu prea vroiam sa-l transform chiar in server pt orice.
   Mai incercasem ceva pe el dar dadusem de o problema in python2.5 care compilat pt el are ceva "hibe", am reusit sa rezolv problemele si sa am python2.5 full functional cu modulele si librariile necesare: setuptools, python-eeml, python-xml.

Cu riscul de a ma repeta am sa recapitulez schema si scripturile implicate.

   Pe Arduino avem:

   Hardware: 2 senzori DS18B20
   Un Lm7805 + led.. bla bla pentru alimentarea de la POE-ul camerei
Toate astea pe un shield
Shield alimentare_conectori


   Cele 2 perechi de cabluri subtiri merg catre senzorii DS18B20, cel ALB mai gros merge la un convertor TTL-RS232 ai apoi in portul serial al camerei.
RS232-TTL
 Sketch:

Folosesc :

<OneWire.h>
<DallasTemperature.h>
Doua librarii de mare utilitate, despre care am scris in postul alterior.

Avem:

#define ONE_WIRE_BUS 6
senzorii la pinul 6
---------------------------------------------------------
if (Serial.available() > 0) {
  incomingByte = Serial.read();
  if (incomingByte==84)
asteapta pe serial caracterul T (ASCII 84)
--------------------------------------------------------
Daca aceasta conditie este indeplinita face request-uri "ByIndex" catre senzori si printeaza pe serial ceva de genul:
RAW Indoor: 24.94 Outdoor: 8.63


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

// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 6
int incomingByte;
// 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()
{
  // start serial port
  Serial.begin(9600);

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


void loop(){
 if (Serial.available() > 0) {
  incomingByte = Serial.read();
  if (incomingByte==84nd) {
  // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.print("RAW");
  Serial.print(" Indoor: ");
  Serial.print(sensors.getTempCByIndex(0)); // Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
  Serial.print(" Outdoor: ");
  Serial.println(sensors.getTempCByIndex(1));
  } 
}
 
}

--------------------------------------------------------
   Pana aici am terminat cu Arduino, ca si concluzie Arduino raspunde cu citirile senzorilor daca cineva-i transmite T pe serial.

   Pe sistemul linux (routerul Asus WL-500) avem:

1. python2.5 pentru a pune feed-ul pe pachube
2. curl

Scriptul 1.


>#!/bin/sh
>python2.5 /mnt/pachube_mobo/read_serial.py
>
>curl -s -d "send=T&buttonSubmit=submit" http://user:pass@server/admin/rs232term?Update=fulltext | grep nooutput
>curl -s http://user:pass@server/admin/rs232term?Update=fulltext | grep RAW  > /mnt/pachube_mobo/temp.txt
>curl -s http://user:pass@server/admin/rs232term?delbuffer | grep nooutput
>

Sunt 3 comenzi curl.
Prima trimite caracterul "T" (ASCII 84) catre terminalul serial al camerei, conectat prin adaptorul RS232-TTL la Arduino
A doua comanda "partseaza" raspunsul si il pune in fisierul temp.txt
A treia comanda "rade" bufferul serial al camerei pentru a-l lasa curat asteptand o noua interogare deci un nou raspuns de la Arduino.

Prima linie, adica :
>python2.5 /mnt/pachube_mobo/read_serial.py

Lanseaza un script de py care va trimite informatia pe pachube.

Scriptul 2.

>import eeml
>import linecache
>
>##################################
>
>temphum = linecache.getline("/mnt/pachube_mobo/temp.txt", 1)
># parameters
>API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
>API_URL = '/api/xxxxxxxx.xml'
>
>readings = temphum.split(' ') # the readings are separated by spaces
>pac = eeml.Pachube(API_URL, API_KEY)
>pac.update([eeml.Data(0, readings[3], unit=eeml.Celsius()), eeml.Data(1, readings[5], unit=eeml.Celsius())])
>pac.put()

Si aici treaba e simpla,
Avem o variabila "temphum" care citeste fisierul temp.txt si "splitueste" valorile
in continuare intervine libraria eeml care pune valorile citite in xml si le trimite pe pachube.

Scripturile sunt rulate de CRON

Cam asta este.
Vreau sa pun si un display 20x4 caractere conectat tot pe ethernet care sa-mi arate temperatura si altele.

Ansamblu
Ansamblu1

Niciun comentariu:

Trimiteți un comentariu