Balise météo vhf et Raspberry pi
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.
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.