RaspFR :: Forum

Forum de la communauté francophone de Raspberry PI.

Vous n'êtes pas identifié(e).

Annonce

Attention !!! Le serveur sera migré d'ici la fin de l'année, une coupure du forum est donc à prévoir dans les semaines à venir.

#1 15-01-2017 23:17:15

remy3885
Membre
Inscription : 15-01-2017
Messages : 4

surveillance de bébé BabylaPi

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à wink .
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.

Dernière modification par remy3885 (15-01-2017 23:18:26)

Hors ligne

#2 16-01-2017 22:33:51

chris57100
Chris
Lieu : Thionville
Inscription : 23-06-2013
Messages : 1 407
Site Web

Re : surveillance de bébé BabylaPi

Tu as essayé dans ton script d'afficher simplement ce que reçoit le raspberry ? Ca donne quoi ta ligne "print(donnee)" après le test de n ? Car si ca marche pour les autres ...


Raspberry Pi Home Server : http://www.pihomeserver.fr
Hotspot Wifi avec portail captif pour Raspberry Pi: Kupiki Hotspot

Hors ligne

#3 17-01-2017 20:09:47

remy3885
Membre
Inscription : 15-01-2017
Messages : 4

Re : surveillance de bébé BabylaPi

Alors il semblerait que la valeur de donnee soit '3'. Je ne comprend pas trop...

Hors ligne

#4 17-01-2017 23:28:50

chris57100
Chris
Lieu : Thionville
Inscription : 23-06-2013
Messages : 1 407
Site Web

Re : surveillance de bébé BabylaPi

Difference entre une chaîne et un entier ?


Raspberry Pi Home Server : http://www.pihomeserver.fr
Hotspot Wifi avec portail captif pour Raspberry Pi: Kupiki Hotspot

Hors ligne

#5 18-01-2017 01:22:27

remy3885
Membre
Inscription : 15-01-2017
Messages : 4

Re : surveillance de bébé BabylaPi

Je comprend pas??

Hors ligne

#6 18-01-2017 01:40:43

CrazyCat
Chat
Inscription : 14-01-2016
Messages : 436

Re : surveillance de bébé BabylaPi

Python est un langage qui fait la différence entre la chaîne de caractères "3" et le chiffre 3. C'est probablement un souci de cast de la donnée entrante, prise comme une chaîne et non pas comme un nombre

Hors ligne

#7 18-01-2017 18:08:19

remy3885
Membre
Inscription : 15-01-2017
Messages : 4

Re : surveillance de bébé BabylaPi

Ah ok je vais regarder ça merci pour la précision, je vais voir si m'en sort.

Hors ligne

Pied de page des forums