PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Pierre-Alain Bandinelli : Mesurer l'humidité avec une sonde DHT22 et la température avec une sonde DS18B20 sur Arduino, transférer l'information à un Raspberry Pi

dimanche 23 octobre 2016 à 07:47

L'objectif de ce billet est d'illustrer l'appariement et le travail synchronisé d'un Arduino et d'un Raspberry Pi. Concrètement, l'Arduino mesure l'humidité avec une sonde DHT22 et la température avec une sonde DS18B20 et l'objectif est de transférer cette information à un Raspberry Pi qui traite l'information et l'envoie sur Internet.

Certains se demanderont pourquoi ne pas tout faire directement avec le Raspberry Pi :

  1. on peut imaginer que tous les ports du Pi sont déjà utilisés
  2. ou que le montage se complique et qu'il n'est plus possible de tout gérer depuis le Pi mais qu'il est plus aisé de lui adjoindre une (ou des) planche(s) Arduino

Principe de communication entre Raspberry Pi et Arduino

Nous allons utiliser un lien série entre les 2 composants au travers d'une connexion USB qui relie les deux équipements. Concrètement, le Raspberry Pi enverra des ordres à l'Arduino sur le port série et écoutera attentivement la réponse qui viendra également sur le port série.

Code Arduino

Mesurer la température avec une sonde DS18B20

Pour faciliter les choses, on utilisera la bibliothèque DallasTemperature.h (disponible ici sur GitHub). Le code est développé ci-dessous et ne présente aucune difficulté particulière :

#include  // Inclusion de la librairie OneWire
#include "DallasTemperature.h" //Librairie du capteur

// Initialize 1-wire
OneWire oneWire(10); //Bus 1-Wire sur la pin 10 de l'arduino
DallasTemperature sensors(&oneWire); //Utilistion du bus Onewire pour les capteurs
DeviceAddress sensorDeviceAddress; //Vérifie la compatibilité des capteurs

void doMeasures() {
  sensors.requestTemperatures(); //Demande la température aux capteurs
  Serial.print("temperature=");
  Serial.println(sensors.getTempCByIndex(0)); //Récupération de la température en degrés celsius du capteur n°0
}

// setup()
void setup() {
  sensors.begin(); //Activation des capteurs
  sensors.getAddress(sensorDeviceAddress, 0); //Demande l'adresse du capteur à l'index 0 du bus
  sensors.setResolution(sensorDeviceAddress, 11); //Résolutions possibles: 9,10,11,12
}

Pour mesurer la température, on appellera la fonction doMeasures().

Mesurer l'humidité avec une sonde DHT22

Là encore, le code n'est pas bien compliqué tant que l'on utilise la librairie DHT.h (par exemple celle d'Adafruit).

#include "DHT.h"

// Initialisation du capteur DHT
#define DHTPIN 12    // Pin sur lequel la sonde DHT 22 est attachée
#define DHTTYPE DHT22   // Type de sonde DHT22 : AM2302, AM2321
DHT dht(DHTPIN, DHTTYPE);

void doMeasures() {
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
  }

  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print("humidity=");
  Serial.println(h);
  Serial.print("temperature="); //Oui, un DHT22 ça mesure aussi la température :-) 
  Serial.println(t);
  Serial.print("heat_index=");
  Serial.println(hic);
}

// setup()
void setup() {
  dht.begin();
}
Écoute sur le port série et actions

Là encore, pas de surprise. La boucle loop() est utilisée pour réagir quand des données sont présentes sur l'interface série. On détecte la nature de l'appel et on peut imaginer différents comportements selon le message reçu. Par exemple, un caractère pourra déclencher le relevé de l'humidité sur DHT22 tandis qu'un autre caractère reçu déclenchera la prise de température sur la sonde DS18B20.

//setup()
void setup() {
  Serial.begin(9600); // Initialisation du port série
}

// for incoming serial data
int incomingByte = 0;
String res = "";

// loop()
void loop() {
  // On écoute sur le port série
  if (Serial.available() > 0) {
          // On lit le contenu du message série et selon le caractère reçu on déclenche une action différente
          incomingByte = Serial.read(); 
          if (incomingByte == 103) { //g
            doAction1();
          }
          if (incomingByte == 104) { //h
            doAction2();
          }
  }
}
Il suffit alors de tout combiner !

Il n'est pas difficile de combiner ces trois morceaux de code !

#include "DHT.h"
#include 
#include "DallasTemperature.h" 

// Initialize DHT sensor.
#define DHTPIN 12
#define DHTTYPE DHT22  
DHT dht(DHTPIN, DHTTYPE);

// Initialize 1-wire
OneWire oneWire(10);
DallasTemperature sensors(&oneWire); //Utilistion du bus Onewire pour les capteurs
DeviceAddress sensorDeviceAddress; //Vérifie la compatibilité des capteurs

// for incoming serial data
int incomingByte = 0;
String res = "";

void doMeasures() {
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
  }

  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print("humidity=");
  Serial.println(h);
  Serial.print("temperature=");
  Serial.println(t);
  Serial.print("heat_index=");
  Serial.println(hic);

  sensors.requestTemperatures(); //Demande la température aux capteurs
  Serial.print("temperature=");
  Serial.println(sensors.getTempCByIndex(0)); //Récupération de la température en celsius du capteur n°0
}

// setup()
void setup() {
  Serial.begin(9600); // Initialisation du port série
  dht.begin();
  sensors.begin(); //Activation des capteurs
  sensors.getAddress(sensorDeviceAddress, 0); //Demande l'adresse du capteur à l'index 0 du bus
  sensors.setResolution(sensorDeviceAddress, 11); //Résolutions possibles: 9,10,11,12
}

// loop()
void loop() {
  // send data only when you receive data:
  if (Serial.available() > 0) {
          // read the incoming byte:
          incomingByte = Serial.read();
          if (incomingByte == 103) { //g
            doMeasures();
          }
  }
}

Code sur le Raspberry Pi

Nous allons utiliser un script Python qui se connectera via le port série à l'Arduino et :

  1. émettra le signal déclenchant l'action (dans notre cas le caractère "g")
  2. écoutera pendant 20 secondes l'éventuelle réponse
  3. transmettra la réponse à un serveur distant dans une requête GET
import serial
import os
import glob
import time
import requests

#Timeout de 20 secondes
tf = time.time()+20

#Initialisation du port série /dev/ttyUSB0 (cela peut varier selon la version de Raspbian et le type de planche Arduino, /dev/ttyUSB0 semble le défaut avec Raspbian Jessie et un Arduino Nano328)
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)

#On attend 2 secondes : si l'on écrit trop vite après l'ouverture du bus série, la communication risque d'échouer
time.sleep(2)

#On écrit le caractère "g" (ASCII 103) sur le port série
print("Now, we are sending the command to Arduino!")
ser.write("g".encode())

#Et on boucle désormais en lecture sur le port série
while time.time()


Ce script peut alors être placé dans le crontab du système pour être exécuté périodiquement.

Gravatar de Pierre-Alain Bandinelli
Original post of Pierre-Alain Bandinelli.Votez pour ce billet sur Planet Libre.

Thuban : Installer OpenBSD sur une partition chiffrée

samedi 22 octobre 2016 à 21:40

Un nouveau tutoriel vous est présenté dans notre wiki. Celui-ci traite de l'installation chiffrée d'OpenBSD -current depuis un système LiveUSB Debian.

Si ce sujet vous intéresse, c'est ici que cela se déroule : OpenBSD+Debian ! ;)

Gravatar de Thuban
Original post of Thuban.Votez pour ce billet sur Planet Libre.

Pierre-Alain Bandinelli : Volumio 2, pour un Raspberry Pi musical

samedi 22 octobre 2016 à 18:59

Bonne nouvelle, Volumio 2 est tout juste sorti et cette nouvelle version améliore encore ce splendide logiciel libre.

Qu'est-ce que c'est ?

Volumio est une version de Raspbian spécialement préparée pour transformer un Raspberry Pi (ou d'autres cartes comme Odroid, Beaglebone...) en serveur musical. Ainsi équipé de Volumio, un Raspberry Pi servira de la musique disponible localement (par exemple dans un disque dur attaché à Volumio) ou sur le réseau local (par exemple un NAS). La première version de Volumio était déjà super (on en parlait ici), la nouvelle édition embellit l'interface, facilite la gestion de systèmes avec plusieurs Volumio (pour des installations dans différentes pièces) tout en conservant les caractéristiques qui faisaient la force de la première itération.

À quoi ça ressemble ?

Voilà l'écran principal de Volumio : Screenshot_2016-10-21_09-13-20.png

Et voici l'affichage des différents Volumio indépendants mais connectés à un même réseau : il n'a jamais été aussi commode de passer de l'un à l'autre ! Screenshot_2016-10-21_09-13-31.png

Comment l'installer ?

C'est d'une grande simplicité. Tout a été déployé et a été fonctionnel sur mon Raspberry Pi équipé d'Hifiberry Amp+ en 15 minutes.

  1. D'abord, télécharger l'image correspondant à votre matériel sur le site de Volumio
  2. Ensuite, sortir le fichier .img de son archive
  3. Le transférer sur une carte micro-SD (/dev/sdb dans l'exemple ci-dessous, à adapter, attention à ne pas se tromper !) avec la commande dd :
dd if=volumio.img of=/dev/sdb bs=4M
  1. Insérer la carte dans le Raspberry Pi et le démarrer
  2. Et voilà ;-)

Après chargement, l'interface graphique est disponible via le navigateur internet que l'on fera pointer vers http://volumio ou vers l'adresse IP du Pi.

Enfin, il est toujours possible d'accéder en SSH au Raspbian sous-jacent avec le nom d'utilisateur "volumio" et le mot de passe "volumio".

L'essayer, c'est l'adopter !

Gravatar de Pierre-Alain Bandinelli
Original post of Pierre-Alain Bandinelli.Votez pour ce billet sur Planet Libre.

genma : Numok - Framasoft & la Degooglisation

samedi 22 octobre 2016 à 10:00

Dans le cadre du festival Numok 2016, voici le support de la conférence sur Framasoft & la Degooglisation

Degooglisons internet numok from Genma Kun

Sources LibreOffice et fichier PDF disponibles sous licence Creative Commons BY SA ici :
-DegooglisonsInternet-Numok.odp
-DegooglisonsInternet-Numok.pdf

A voir également Guide d'Hygiène numérique version 2016

Gravatar de genma
Original post of genma.Votez pour ce billet sur Planet Libre.

Articles similaires

Angristan : Seedbox : installer le client torrent Transmission sous Debian et Ubuntu

vendredi 21 octobre 2016 à 16:38

Seedbox : installer le client torrent Transmission sous Debian et Ubuntu

Étant en pleine migration de mon dédié SoYouStart vers un VPS PulseHeberg pour ma seedbox, j'en profite pour écrire une série de tutoriel lié à l'installation de celle-ci.

Transmission est un client qui permet de télécharger des fichiers torrent. Il est disponible sur un grand nombre de plateformes sous la forme un client "lourd", un outil en ligne de commande, ou encore un service en arrière plan, ce qui nous intéresse ici pour notre seedbox.

C'est un client qui existe depuis 11 ans et qui est très stable. Il n'a pas énormément de fonctionnalités, mais il est léger et c'est une valeur sûre. :)

Une Seedbox ?

Une seedbox est un serveur dédié au téléchargement et au partage de fichiers torrents. Transmission est une interface web qui nous permet de télécharger ces fichiers.

Pourquoi avoir une seedbox ? Le fait que ce soit un serveur signifie que :

• vous avez beaucoup de stockage • vous avez beaucoup de bande passante, donc des téléchargements rapides • vous n'êtes pas surveillés par HADOPI • vous pouvez regarder vos films ou séries en streaming depuis votre serveur.

Installation

C'est probablement le client qui s'installe le plus facilement, puisqu'il est disponible sous forme de paquet dans les dépôts.

apt install transmission-deamon

Configuration

Ensuite, on va pouvoir modifier le fichier de configuration ici :

nano /etc/transmission-daemon/settings.json

Attention : une fois les modifications effectuées, il faudra faire service transmission-daemon reload et non pas restart. En effet, pour une raison obscure, si vous faites restart, le fichier de conf va se réinitialiser...

Transmission sera accessible à cette adresse : http://IP_DU_SERVEUR:9091/transmission/web/.

Vous aurez une erreur vous indiquant que vous n'avez pas le droit d'y accéder. En effet la page est protégé par une whitelist d'IPs et une authentification par utilisateur et mot de passe.

Il va falloir aller chercher ici dans la conf :

 "rpc-authentication-required": true, // Activation de l'auth par mot de passe
 "rpc-bind-address": "0.0.0.0", // 127.0.0.1 pour écouter en local
 "rpc-enabled": true, // Activation de l'interface web
 "rpc-password": "MOT_DE_PASSE", // Tapez votre mot de passe, il sera salé au reload
 "rpc-port": 9091, // Port d'écoute
 "rpc-url": "/transmission/", // Correspond à l'URL d'accès
 "rpc-username": "UTILISATEUR", // Nom d'utilisateur pour l'auth
 "rpc-whitelist": "127.0.0.1", // IPs à whitelist
 "rpc-whitelist-enabled": true, // Activation de la whitelist

(Attention à ne pas mettre les commentaires et // dans votre conf, ça marchera pas)

Le reste des options dans la configuration concerne les dossiers de téléchargement, le ratio de partage, la vitesse, les slots, les peers, etc.. Vous trouverez une explication complète du fichier ici.

Une fois que vous avez configuré transmission à votre goût, vous pouvez commencer à télécharger !

Seedbox : installer le client torrent Transmission sous Debian et Ubuntu

Configurer un reverse proxy HTTPS avec Nginx

Tant qu'on y est, autant faire les choses proprement, et accéder à notre seedbox en HTTPS via un nom de domaine :)

Pré-requis :

On va faire en sorte que Transmission n'écoute qu'en local :

"rpc-bind-address": "127.0.0.1",

Ensuite, on configure Nginx. Dans cet exemple ce sera pour le domaine seedbox.hadopi.fr.

La configuration sera à placer dans /etc/nginx/conf.d/seedbox/conf ou /etc/nginx/sites-enabled/seedbox.conf, selon votre version de Nginx.

upstream transmission  {
 server 127.0.0.1:9091;
}
server {
 listen 80;
 server_name seedbox.hadopi.fr;
 return 301 https://seedbox.hadopi.fr$request_uri;

 access_log /dev/null;
 error_log /dev/null;
}

server {
 listen 443 ssl http2;
 server_name seedbox.hadopi.fr;

 ssl_certificate /etc/letsencrypt/live/seedbox.hadopi.fr/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/seedbox.hadopi.fr/privkey.pem;
 ssl_trusted_certificate /etc/letsencrypt/live/seedbox.hadopi.fr/chain.pem;

 access_log /var/log/nginx/seedbox-access.log;
 error_log /var/log/nginx/seedbox-error.log;

 ssl_protocols TLSv1.2;
 ssl_ecdh_curve secp384r1;
 ssl_ciphers EECDH+AESGCM:EECDH+AES;
 ssl_prefer_server_ciphers on;
 resolver 80.67.169.12 80.67.169.40 valid=300s;
 resolver_timeout 5s;
 ssl_stapling on;
 ssl_stapling_verify on;
 ssl_session_cache shared:SSL:10m;
 ssl_session_timeout 5m;
 ssl_session_tickets off;

 location / {
  return 301 https://$server_name/transmission/;
 }

 location ^~ /transmission {
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_set_header Connection "";
  proxy_pass_header X-Transmission-Session-Id;
       
  location /transmission/rpc {
   proxy_pass http://transmission;
  }
       
  location /transmission/web/ {
   proxy_pass http://transmission;
  }
       
  location /transmission/upload {
   proxy_pass http://transmission;
  }
       
  location /transmission/web/style/ {
   alias /usr/share/transmission/web/style/;
  }
       
  location /transmission/web/javascript/ {
   alias /usr/share/transmission/web/javascript/;
  }
       
  location /transmission/web/images/ {
   alias /usr/share/transmission/web/images/;
  }
           
  location /transmission/ {
   return 301 http://$server_name/transmission/web;
  }
 }
}

La configuration HTTPS est tiré de mon article sur le sujet.

Et voilà, profitez bien !

Seedbox : installer le client torrent Transmission sous Debian et Ubuntu


Image de une par Revista Espírito Livre.

Je me propose aussi de vous installer votre seedbox sur 5euros.com.

L'article Seedbox : installer le client torrent Transmission sous Debian et Ubuntu a été publié sur Angristan

Gravatar de Angristan
Original post of Angristan.Votez pour ce billet sur Planet Libre.