Quantcast
Channel: AFPy's Planet
Viewing all articles
Browse latest Browse all 3409

[hautefeuille] Sonde de température Onewire, Arduino et visualisation OpenGL en Python

$
0
0

L’objectif de cette note est de réaliser un appareil capable de mesurer les températures, de transmettre ces données sans-fil à une station et enfin de réaliser un visualiseur de données en OpenGL.

Je vous conseille de lire une note précédente au sujet du capteur DS1821:

http://hautefeuille.eu/capteur-de-temperature-dallas-1821.html

Travail préparatoire

  • Configurer les modules Xbee correctement,
  • Conception physique et électrique.

Composants matériels

  • Module Arduino,
  • Sonde de température DS1821 avec sa résistance,
  • Ecran LCD avec son module série (http://www.crystalfontz.com),
  • 2 modules Xbee pour émission et réception
  • Un convertisseur série vers usb pour un des modules Xbee.

Composants logiciels

  • Arduino IDE
  • Python 2.7.x
  • Kivy (kivy.org)
static/pictures/module_arduino.png

Protocole d’échange sur le port série

J’ai décidé de formater mes paquets de données de la manière suivante:

$val1!val2!...*

Ce choix rend plus facile les manipulations ultérieures des données.

Code source Arduino

code:

#include <SoftwareSerial.h>
#include <OneWire.h>

// DS1821 on digital pin 2 external
OneWire ds(2);

// DS1821 on digital pin 8 internal
OneWire ds1(8);

// LCD on digital pin 6 et 7
SoftwareSerial LCD(6, 7);

// LCD on digital pin 6 et 7
SoftwareSerial XBEE(3, 4);

int led = 13;

void setup(void)
{
    LCD.begin(9600);
    XBEE.begin(57600);
    Serial.begin(9600);

    //start 1821 conversion external
    ds.reset();
    ds.write(0xEE);

    //start 1821 conversion internal
    ds1.reset();
    ds1.write(0xEE);

    pinMode(led, OUTPUT);
    digitalWrite(led,LOW);
}

void loop(void){
    // external _
    // internal 1
    byte temp_, temp1_;
    byte present, present1;

    // protocol
    // $val0|val1|...*
    // start packet
    String paquet = "$";

    digitalWrite(led,LOW);
    delay(1000);

    // Read value external
    present = ds.reset();
    ds.reset();
    ds.write(0xAA);
    temp_ = ds.read();

    // Read value internal
    present1 = ds1.reset();
    ds1.reset();
    ds1.write(0xAA);
    temp1_ = ds1.read();

    //start 1821 conversion external
    ds.reset();
    ds.write(0xEE);

    //start 1821 conversion internal
    ds1.reset();
    ds1.write(0xEE);

    // negative temp external
    if (temp_ >> 7 == 1){
        paquet = paquet + "E";
        paquet = paquet + "!-";
        paquet = paquet + ((temp_ ^ 0xFF) + 1); // bit inversion
    }
    // positive temp external
    else
    {
        paquet = paquet + "E";
        paquet = paquet + "!+";
        paquet = paquet + temp_;

    }
    // negative temp internal
    if (temp1_ >> 7 == 1){
        paquet = paquet + "!I";
        paquet = paquet + "!-";
        paquet = paquet + ((temp1_ ^ 0xFF) + 1); // bit inversion
    }
    // positive temp internal
    else
    {
        paquet = paquet + "!I";
        paquet = paquet + "!+";
        paquet = paquet + temp1_;
    }
    // closing packet
    paquet = paquet + "*";
    Serial.print(paquet);
    LCD.print("?n");
    LCD.print(paquet);
    XBEE.print(paquet);
    digitalWrite(led,HIGH);
    delay(1000); // default 500
}

Code source Python pour le visualiseur

code:

# -*- coding: utf-8 -*-
"""
@author: julien@hautefeuille.eu

#sudo apt-get install python-kivy

Usage: viewerGL.py
"""

import kivy
kivy.require('1.5.1')

from kivy.app import App

from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock

import serial

class MeteoArduino(App):

    title = 'Meteo Arduino'

    def build(self):

        layout = BoxLayout(
            orientation='vertical',
            spacing=10,
            padding=10)

        label_temp = Label(
            text='',
            font_size='60sp',
            size_hint=(1, 0.5))

        label_temp1 = Label(
            text='',
            font_size='60sp',
            size_hint=(1, 0.5))

        layout.add_widget(label_temp)
        layout.add_widget(label_temp1)

        def get_packet(obj):
            data = ser.read(13)
            if data.startswith("$") and data.endswith("*"):
                clean = data.strip('$').strip('*').strip()
                split = clean.split('!')
                label_temp.text = split[1]
                label_temp1.text = split[3]
                print split
            else:
                pass

        Clock.schedule_interval(get_packet, 1)

        return layout

if __name__ == '__main__':
    connection = '/dev/ttyUSB0'
    ser = serial.Serial(connection, 9600)
    MeteoArduino().run()

Viewing all articles
Browse latest Browse all 3409

Trending Articles