Balise météo vhf et Raspberry pi

 

LA VERSION (presque) DÉFINITIVE EN BOITE  ICI

 

 

Débutée le 20 août 2015 .  mise à jour le 08 mai 2016  ....... ça fonctionne !!

Le principe de cette balise, est de transmettre automatiquement a heure fixe et/ou sur demande, les informations sur la météo du moment (et du lieu de la balise) sur une fréquences radioamateur vhf en phonie.

 

Les informations sont, la température, la pression atmosphérique, la vitesse du vent et sa direction.

 

Le fonctionnement de cette balise est assuré par un Raspberry PI . il devra récupérer les donnés en provenance des capteurs, les enregistrer dans un fichier texte, activer l’émetteur, préparer les informations à transmettre, activer la synthèse vocale et gérer le temps et/ou la demande.

Le programme est écrit en Python 2.7

 

Le Raspberry pi est en état, il fonctionne avec la dernière version de Rasbian. Il faut le mettre a jour et charger les bibliothèques donc nos aurons besoin par la suite.

 


BRANCHER ET RECUPERER LES INFOS DU CAPTEUR BMP 180

Pour brancher la sonde, il faut quatre fils à connecter comme ci-dessous

La communication entre le raspberry et la sonde ce fait avec le protocole I2C, il faut donc l’activer :

            1) Avec raspi-config (sudo raspi-config)

                        Choisir la ligne 5 et activer l’I2C

           

            2) Puis suivre le tuto suivant :

 http://www.manuel-esteban.com/lire-une-sonde-bmp085-avec-un-raspberry-pi/

le tuto fonctionne avec les deux sondes BMP085 ou BMP180.

Si le lien a un problème voici le PDF de la page.

manuel-esteban.com-Lire une sonde BMP085
Document Adobe Acrobat 175.5 KB

 ENREGISTRER DANS UN FICHIER TXT

Les informations venues des capteurs sont mis en forme puis enregistrées dans un fichier texte qui pourra servir pour des statistique plus tard.

            En python, la procédure est on ne peut pus simple, ouvrir le fichier .txt (il est crée si il n’existe pas), aller à la ligne, enregistrer la ligne d’info, fermer le fichier.

 ACTIVER LA SYNTHESE VOCALE

          Le plus simple avec le raspberry est d’installer ESPEAK, le rendu de la voie n’est pas excellent, mais la mise en œuvre ne pose pas de problème particulier. Une voie féminine (avec un léger accent Bavarois) fera l’affaire.

          La, il y a des progrès a faire, ou un autre système a à mettre en oeuvre car la diction n'est vraiment pas au top!    

COMMANDER L’EMETEUR

          La commande ce fait via la broche GPIO23 qui mette le PTT a la masse ce qui provoque le passage en émission du TRX.

Le montage de base qui permet de faire des tests en émission du TRX.

AJOUT  DES CAPTEURS GIROUETTE ET ANEMOMETRE

Pour récupérer les infos d’une girouette et d’un anémomètre, il existe un capteur/interface qui se branche sur un port USB et qui peut être calibré pour cinq entrées différentes. Pour le moment, deux suffirons.

 

http://www.yoctopuce.com/FR/products/capteurs-electriques-usb/yocto-knob

publicité gratuite

 

Pour la girouette, un senseur résistif assure la direction du vent. Après calibrage nous disposons de 16 secteurs de vent, ce qui est bien suffisant !

 

            Pour l’anémomètre, un capteur optoélectronique envoie des impulsions à l’interface qui s’occupe du comptage et du timer.

Un calibrage, s’impose !

la connexion ce fait par le bornier vert, le premier a gauche est la masse commune (0). avec le (1, le suivant) ils seront connectés à la girouette. 

Pour l’anémomètre, le (0) et le (2) ainsi qu'une alimentation 5v pour le capteur optique, le fil rouge. 

MISES AUX POINTS ET ESSAI GRANDEUR NATURE

        Un des problème à résoudre et la date et l’heure, en effet, le ‘rasp’ n’a pas de système de sauvegarde de ces données.

          Sans connexion Internet et après une coupure de courant, plus de date , plus d’heure. Il faut donc installer un module RTC. Le tuto de François MOCQ est très bien fait et fonctionne du premier coup.

http://www.framboise314.fr/un-module-rtc-a-base-de-ds1302-pour-le-raspberry-pi/

 

 

récapitulatif des branchements sur le GPIO d'un PI V2

 

MODULE RTC

VCC = pin 1 = 3.3v

GND = pin 6 = ground

CLK = pin 13 = GPIO 27

DAT = pin 12 = GPIO 18

RST = pin 11 = GPIO 17

 

SONDE BMP 180

VCC = nc

GND = pin 6 = ground

SCL = pin 5 = GPIO 3

SDA = pin 3 = GPIO 2

3.3v = pin 1 = 3.3v

 

EMETEUR

PTT = pin 16 = GPIO 23

GND = pin 6 = ground

 

LE PROGRAMME EN PYTHON 2.7

Il y a sûrement moyen de faire autrement, plus court ou plus ‘académique’ mais mon niveau en Python n’est pas très élevé. Le but principal est que ça fonctionne et c’est le cas de cette première version.

            Des améliorations pourront être apporté pas la suite comme la synthèse vocale..

 

Des tests sont en court au radio club de GRANVILLE  sur une fréquences balise VHF au tour de 144.475 Mhz avec une puissance de 0.5 W.

            Vos contre rendu d’écoute sont les bienvenues 

 

          Une nouvelle version du programme est disponible ci dessous avec une modification de la gestion de l'heure.

 

Des problèmes de stabilité du soft dans la version avec les quatre données, alors que la première version avec la température et la pression fonctionnent bien.

 

...les problèmes de stabilité sont réglés... houf . merci à François du site http://www.framboise314.fr/   et à Jacques D ainsi qu' à Marc Martin de Yoctopuce 

 

 donc voici le programme en version TXT et en bas le fichier téléchargeable.

si vous avez des questions, je suis a votre disposition. 

 

73 et bonne bidouille

Philippe/F5SAZ 

version 1.86 du programme en python

 

 

#!/usr/bin/python2.7

# -*- coding: utf-8 -*-

# Balise meteo radioamateur sur raspberry et python 2.7 par F5SAZ 

#pression atmospherique, temperature, force et directiondu vent.*

#*********************version 1.86 bêta 2016*********************

#****************************************************************

 

import Adafruit_BMP.BMP085 as BMP085

import datetime

import time

import locale

import os

import sys

import RPi.GPIO as GPIO

from subprocess import call

sys.path.insert(0,"/home/pi/yoctopython/")        #suivant config sur votre micro

from yocto_api import *

from yocto_anbutton import *

 

errmsg=YRefParam()

 

locale.setlocale(locale.LC_TIME,'')               #Francisation de la date

 

GPIO.setmode(GPIO.BCM)                            #utilisation des n° de ports du processeur

GPIO.setup(23, GPIO.OUT)                          #mise en sortie du port GPIO23  (broche 16)

 

i = 0

 

while 1:

 

# mise en veille de la balise de 22h à 06h00

 

    v = datetime.datetime.now().strftime('%H')    #control de l'heure

    

    if v == "22":

YAPI.Sleep(28800000)              #fin du dodo 8 heures plus tard

 

 

# reglage de la tempo toutes les 15 minutes

    

    h = datetime.datetime.now().strftime('%M,%S') #control des minutes et secondes

 

    if h == "15,00" or h == "30,00" or h == "45,00" or h == "00,00":

 

# initialise l'api

 

        if YAPI.RegisterHub("usb", errmsg)!= YAPI.SUCCESS:

            sys.exit("init error"+errmsg.value)

 

# cherche l'entree avec le nom logique entree1

 

        channel= YAnButton.FindAnButton('direction')

        channel2= YAnButton.FindAnButton('vitesse')

 

 

# verifie que l'entre a bien été trouvée

 

        if not(channel.isOnline()):

            sys.exit("pas trouvé d'entrée avec le nom logique 'direction'")

 

        if not(channel2.isOnline()):

            sys.exit("pas trouvé d'entrée avec le nom logique 'vitesse'")

 

       

# affiche la valeur de l'entree en question

 

        source = (channel.get_calibratedValue())  #variable direction du vent canal 1

 

        pulse = (channel2.get_pulseCounter())     #variable impulsion

    

        temps = (channel2.get_pulseTimer())       #variable temps

 

        

 

# rose des vents!!

 

        if source <= 945 and source >= 893:       #ces valeur sont a adapter suivant

            direction = "nord"                    #la girouette utilisé

        elif source <= 892 and source >= 796:     #cardineaux en phonetique!!

            direction = "nord  nord  éste"

        elif source <= 795 and source >= 709:

            direction = "nord  éste"

        elif source <= 708 and source >= 629:

            direction = "éste  nord  éste"

        elif source <= 628 and source >= 556:

            direction = "éste"

        elif source <= 555 and source >= 490:

            direction = "éste  sude  éste"

        elif source <= 489 and source >= 403:

            direction = "sude  éste"

        elif source <= 402 and source >= 322:

            direction = "sude  sude  éste"

        elif source <= 321 and source >= 272:

            direction = "sude"

        elif source <= 271 and source >= 228:

            direction = "sude  sude  oueste"

        elif source <= 227 and source >= 186:

            direction = "sude  oueste"

        elif source <= 185 and source >= 147:

            direction = "oueste  sude  oueste"

        elif source <= 146 and source >= 110:

            direction = "oueste"

        elif source <= 109 and source >= 76:

            direction = "oueste  nord  oueste"

        elif source <= 75 and source >= 44:

            direction = "nord  oueste"

        elif source <= 43 and source >=14:

            direction = "nord  nord  oueste"

        elif source <=13:

            direction = "nord"

 

# vitesse du vent

                  

        p = pulse / 5.                            #sur mon anemo. 

        t = temps /1000.                          #conversion de miliseconde en seconde

                     

        f = p / t                                 #determination de la frequence

                                                  #formule: 2*pi*r*f = en metre par seconde  

 

        vitvent = 2*3.14*0.070*f*3600/1000        #vitesse vent en Km/h

 

        vitevt = int(vitvent)                     #conversion en entier pour supprimer la virgule

        

        vitv = str(vitevt)                        #conversion des chiffres en texte

    

       

# TEMPERATURE et PRESSION

 

        sensor = BMP085.BMP085()

 

        degre_c = sensor.read_temperature()       #variable temperature

        pression = sensor.read_pressure()/100 +5  #variable pression

 

        degre_b = int(degre_c)                    #conversion en entier pour supprimer la virgule

    

        tp = str(degre_b)                         #conversion des chiffres en texte

        pr = str(pression)                        #pour en chaine de caracteres

 

 

# DATE et HEURE

 

        ce_jour = time.strftime("%A %d %B %Y ")   #variable date

        cette_heure = time.strftime("%H")         #variable heure

        cette_minute = time.strftime("%M")        #variable minute

 

        phrase0 = "balise météo experimentale du radioclub de granville F  5  K  A  Q  "

        phrase1 = ce_jour + cette_heure+" heure "+cette_minute+" minute  "

        phrase2 = "température  "+tp+" degré celcius "

        phrase3 = "préssion atmosphérique  "+pr+" hectopascale "

        phrase4 = "vent de  "+direction+"  vitesse  "+vitv+" kilométreheure"

 

    

        phrase =(phrase1)+tp+" "+pr+" "+vitv+" "+direction   #phrase à enregistrer

 

        phrase9 =(phrase2)+(phrase3)              #3eme phrase à emettre

    

# GESTION du FICHIER

 

        m = datetime.datetime.now().strftime('%b')#recuperation du mois

 

        fichier = "meteo_"+m+".txt"               #nom du fichier qui change tous les mois   

 

        fichier_meteo = open(fichier,"a")         #ouverture du fichier meteo,,,,,,.txt

 

            

        fichier_meteo.write("\n")                 #retour a la ligne

        fichier_meteo.write(phrase)               #ecriture de la phrase

        fichier_meteo.close()                     #fermeture du fichier

 

# GESTION DE LA PAROLE ET PASSAGE EN EMISSION

 

    

        phrase5 = phrase0.replace(" ","-")        #remplace les espace par des - pour espeak

        phrase6 = phrase1.replace(" ","-")

        phrase7 = phrase9.replace(" ","-")

        phrase8 = phrase4.replace(" ","-")

 

        GPIO.output(23, GPIO.HIGH)                #emission

 

        time.sleep(1)                             #pause 1 seconde

           

        call(["espeak","-vfr+15","-p60","-s170",phrase5])        #voie femme en francais

        call(["espeak","-vfr+15","-p60","-s170",phrase6])

        call(["espeak","-vfr+15","-p60","-s170",phrase7])

        call(["espeak","-vfr+15","-p60","-s170",phrase8])

          

        GPIO.output(23, GPIO.LOW)                 #arret emission

 

       

        channel2.resetCounter()                   #remise a zero du compteur 

        YAPI.Sleep(780000)                        #pause de 13 minutes

        

 

si vous voulez le fichier au format .py , écrivez moi que je vous l'envoie car je ne peux pas mettre ce format sur ce site.