Bonjour je suis en train de faire un appareille de surveillance pour ma fille qui va bientôt arriver. Je voudrais avoir la possibilité de savoir si elle pleur si elle bouge, mais aussi de relever la température, l’humidité et la luminosité de la chambre. J’ai aussi mis une petite caméra qui trainait par là .
Les infos des capteurs sont collectés par une arduino micro et la raspi récupère et traite ces infos.
le code:
[== C++ ==]
/******************************************************************************************************/
/*
Programme de récupération des données des capteurs et de communication avec raspberry Pi
*/
/******************************************************************************************************/
int ser = 0;
int pleur = 0;
/********************************************Parametre MICRO*******************************************/
const int sampleWindow = 250; // Sample window width in mS (250 mS = 4Hz)
unsigned int knock;
void Micro()
{
unsigned long start= millis(); // Start of sample window
unsigned int peakToPeak = 0; // peak-to-peak level
unsigned int signalMax = 0;
unsigned int signalMin = 1024;
// collect data for 250 miliseconds
while (millis() - start < sampleWindow)
{
knock = analogRead(0);
if (knock < 1024) //This is the max of the 10-bit ADC so this loop will include all readings
{
if (knock > signalMax)
{
signalMax = knock; // save just the max levels
}
else if (knock < signalMin)
{
signalMin = knock; // save just the min levels
}
}
}
peakToPeak = signalMax - signalMin; // max - min = peak-peak amplitude
double volts = (peakToPeak * 3.3) / 1024; // convert to volts
if (volts >=0.2)
{
pleur = 1;
}
else
{
pleur = 0;
}
}
/*********************************************Parametre PIR********************************************/
const int sensorPin = 8;
const int learningPeriod = 30*1000; // ms // <1>
int learningCompleted = 0;
int mouv = 0;
void PIR()
{
if(digitalRead(sensorPin) == HIGH) {
mouv = 1;
}
else {
mouv = 0;
}
}
/*********************************************Parametre DHT********************************************/
#include "DHT.h"
#define DHTPIN 7 // pin digital ou est connecte DHT
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
void Temperature()
{
// 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();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(false);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
Serial.print("03"); // Temperature
Serial.print(t);
Serial.println("/n");
}
void Humidite()
{
// 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();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(false);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
Serial.print("04"); // Humidite
Serial.println(h);
}
/*******************************************Parametre TSL2561*******************************************/
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_TSL2561_U.h>
Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);
void configureSensor(void)
{
/* You can also manually set the gain or enable auto-gain support */
// tsl.setGain(TSL2561_GAIN_1X); /* No gain ... use in bright light to avoid sensor saturation */
// tsl.setGain(TSL2561_GAIN_16X); /* 16x gain ... use in low light to boost sensitivity */
tsl.enableAutoRange(true); /* Auto-gain ... switches automatically between 1x and 16x */
/* Changing the integration time gives you better sensor resolution (402ms = 16-bit data) */
tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS); /* fast but low resolution */
// tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_101MS); /* medium resolution and speed */
// tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_402MS); /* 16-bit data but slowest conversions */
}
void TSL()
{
/* Get a new sensor event */
sensors_event_t event;
tsl.getEvent(&event);
/* Display the results (light is measured in lux) */
if (event.light)
{
Serial.print("05"); // Lumiere
Serial.println(event.light);
}
else
{
/* If event.light = 0 lux the sensor is probably saturated
and no reliable data could be generated! */
Serial.println("Sensor overload");
}
}
/****************************PROGRAMME PRINCIPAL******************************/
void setup()
{
Serial.begin(115200);
pinMode(sensorPin, INPUT);
Serial.println("Starting to learn unmoving environment...");
Serial.println("DHTxx test!");
Serial.println("Light Sensor Test"); Serial.println("");
/* Initialise the sensor */
if(!tsl.begin())
{
/* There was a problem detecting the TSL2561 ... check your connections */
Serial.print("Ooops, no TSL2561 detected ... Check your wiring or I2C ADDR!");
while(1);
}
configureSensor();
Serial.println("");
dht.begin();
}
void loop()
{
if(millis() < learningPeriod) { // <3>
delay(20); // ms // <4>
return; // <5>
}
if(learningCompleted == 0) { // <6>
learningCompleted = 1;
Serial.println("Learning completed.");
}
Micro();
PIR();
if (pleur == 1)
{
Serial.println("pleur");
delay(100);
}
else if (mouv == 1)
{
Serial.println("mouvement");
delay(100);
}
else
{
if (Serial.available()>0) {
ser = Serial.read()-'0'; // ser = Serial.read()-'0' on soustrait le caractère 0, qui vaut 48 en ASCII
Serial.println(ser);
delay(10);
switch (ser)
{
case 3:
Temperature();
delay(500);
break;
case 4:
Humidite();
delay(500);
break;
case 5:
TSL();
delay(500);
break;
}
}
}
delay(100);
}
Si le bébé pleur, « pleur » est envoyé sur le port série et la raspi le voie sur le port série et exécute une commande http.
Si un mouvement est détecté, mouvement est envoyé, raspi le voie et prend une photo, enregistre une petite vidéo de 10s, envoi la photo par ftp et exécute une commande http.
script:
[== Python ==]
Surveillance de bebe (communication entre Raspi, Arduino et eedomus)
import time
import urllib2
import serial
from picamera import PiCamera
from ftplib import FTP
DEVICE = '/dev/ttyACM0'
BAUD = 115200
camera = PiCamera()
camera.rotation = 90
#Parametres connection FTP
#PI='/home/pi/BabylaPi/Capture/image.jpg'
#HOST="camera.eedomus.com"
#USER='xxxxxxx'
#PASSWD='yyyyyyyyy'
def send_ftp(): #envoie de la photo par ftp
ftp = FTP('camera.eedomus.com', 'USER', 'PASSWD')
f_name = "image.jpg"
f = open(f_name, 'rb')
ftp.storbinary('STOR ' + f_name, f)
f.close()
def capture(): #Prise de photo en cas de mouvement
try:
for i, filename in enumerate(camera.capture_continuous('image.jpg')):
time.sleep(1)
if i == 1:
break
finally:
send_ftp()
time.sleep(0.1)
def main():
ser = serial.Serial(DEVICE, BAUD) #lecture du port serie
print(ser.readline())
while True:
n = ser.inWaiting()
if n != 0: #une valeur attend dans le buffer
data = ser.read(n)
print(data)
if data[0:2] == "pleur": #pleur est recuperé sur le port serie
url_response = urllib2.urlopen('https://api.eedomus.com/set?action=periph.value&api_user=xxxxxx&api_secret=XXXXXXXXX&periph_id=476180&value=1')
time.sleep(5)
url_response = urllib2.urlopen('https://api.eedomus.com/set?action=periph.value&api_user=xxxxxx&api_secret=XXXXXXXXX&periph_id=476180&value=0')
if data[0:2] == "mouvement": #mouvement est recupere sur le port serie
url_response = urllib2.urlopen('https://api.eedomus.com/set?action=periph.value&api_user=xxxxxx&api_secret=XXXXXXXXX&periph_id=476189&value=1')
capture()
camera.start_recording('/home/pi/BabylaPi/Capture/video.h264')#enregistre une video de 10 secondes
time.sleep(10)
camera.stop_recording()
url_response = urllib2.urlopen('https://api.eedomus.com/set?action=periph.value&api_user=xxxxxx&api_secret=XXXXXXXXX&periph_id=476189&value=0')
if __name__ == "__main__":
main()
Trois autres script python sont exécutés toute les 30 secondes pour récupérer les températures, humidité et luminosité et les envoyer dans une base de donnée.(cette fonction ne marche pas, je n’arrive pas à récupérer la valeur sur la raspi).
script pour la température:
[== Python ==]
#!/usr/bin/python
#
#=========================================================================
# temp_Pikos.py
#-------------------------------------------------------------------------
#
#
#-------------------------------------------------------------------------
# ce script lit la temperature depuis arduino micro par laison serie
# usb avec raspberry pi et les stock dans une
# base MySQL stocke sur NAS Synology
#
#===================================================================
#----------------------------------------------------------#
# package importation #
#----------------------------------------------------------#
import urllib2
import sys
import serial
import sqlite3
import MySQLdb
import time
#-----------------------------------------------------------------#
# constants : utilisez vos propres valeurs #
#-----------------------------------------------------------------#
DEVICE = '/dev/ttyACM0'
BAUD = 115200
def bdd_temp():#envoi la valeur de la temperature relevé dans une base de donnée
print "base MySQL connexion..."
try:
db = MySQLdb.connect(host='xxx.xxx.x.xx',user='user',passwd='pass',db='BabylaPi')
except Exception:
print "Erreur connexion MySQL"
else:
print "base MySQL ouverte"
cur = db.cursor()
requete=("INSERT INTO temperature"
"(temp)"
"VALUES (%s)")
try:
# execute la requete
cur.execute(requete, capteur_value)
print "...Mise a jour de la base"
db.commit()
except Exception:
print "Erreur avec la Requete= " + requete
print "...Retour etat precedant de la base"
db.rollback()
else:
print "Requete executee"
db.close()
print "base fermee"
#----------------------------------------------------------#
# code principal #
#----------------------------------------------------------#
ser = serial.Serial(DEVICE, BAUD) #lecture du port serie
#print(ser.readline())
time.sleep(4)
try:
ser.write(str('3'))# envoi 3 sur le port série correspondant à la demande de temperature
time.sleep(0.5)
n = ser.inWaiting()
if n != 0: #une valeur attend dans le buffer
donnee = ser.readline(n)#lit la valeur dans le buffer
print(donnee)
id_capteur = donnee[0:2] #decoupe les messages pour extraire les donnees (donnée=010.75 ; [0:2] id_capteur 01, le son. [2:6] valeur releve, 0.75)
if id_capteur == "03":
print(donnee)
capteur_value = donnee[3:]
bdd_temp()
else:
ser.write('3')
time.sleep(1)
finally:
time.sleep(10)
La valeur ‹ 3 › est bien envoyé à l’arduino elle s’affiche sur la console arduino, l’arduino affiche bien message avec la temperature mais la raspi ne recupère pas le message.
Si quelqu’un peut me sortir de la panade car ma petite ne va pas tarder à pointer le bout de son nez mais je n’arrive pas à finaliser mon projet.
ps : Je ne suis pas un expert en programmation comme vous pouvez le voir avec mes codes assez brouillon dsl.