diff --git a/ASTREOS_SMP.ino b/ASTREOS_SMP.ino index b20a084ad03cb98f415c0e485cf4e4a1db98b47f..d7108dab6bc5cf246c7471ea6299993a321f1da2 100644 --- a/ASTREOS_SMP.ino +++ b/ASTREOS_SMP.ino @@ -20,7 +20,7 @@ void loop(){ // ---------------------------------- Lecture et calcul du champ magnétique ---------------------------------------- // lecture de la valeur analogique (entre 0 et 1024) pour une tension entre 0 et 5V - int hallAnalogique = analogRead(PORT_HALL); + hallAnalogique = analogRead(PORT_HALL); // transforme la valeur lue en Gauss // les valeurs évoluant entre 102 et 922 sont transformées en valeur évoluant entre -640 et 640 @@ -37,6 +37,7 @@ void loop(){ //Serial.print("Lecture de la tension en mV = "); Serial.println(fsrVoltage); if (fsrVoltage == 0) { Serial.println("Aucune pression"); + newton = 0 ; } else { // La tension = Vcc * R / (R + FSR) où R = 10K et Vcc = 5V // d'où FSR = ((Vcc - V) * R) / V @@ -64,6 +65,6 @@ void loop(){ Serial.print("=> Force Analogique = "); Serial.print(fsrAnalogique); Serial.print(" || Force en Newtons: "); Serial.println(newton); // attendre 100 millisecondes - delay(100); + delay(1000); } diff --git a/Arduino/ASTREOS.ino b/Arduino/ASTREOS.ino new file mode 100644 index 0000000000000000000000000000000000000000..4aa6500489f60d2de07c12bf0342af1f4027e752 --- /dev/null +++ b/Arduino/ASTREOS.ino @@ -0,0 +1,92 @@ +/* + GaussPlot 27/12/2011 Arduining.com +Showing Gauss measured by the SS495B in the serial monitor. +(Miniature Radiometric Linear Hall Efect Sensor) +Sensor connected to Analog channel 0. + +Translated and commented by Meurisse D. for the tutorial +http://wiki.mchobby.be/index.php?title=Senseur-Hall-SS495A + +*/ +#define XRANGE 50 +#define PORT_HALL A0 +#define PORT_FSR A2 + +int x,gss ; + +int fsrAnalogique ; // La lecture analogique depuis le pont diviseur FSR+Resistance. +int fsrVoltage; // La lecture analogique convertie en tension +unsigned long fsrResistance; // La tension convertie en resistance +unsigned long fsrConductance; +long fsrForce; // La resistance convertie en force (Newton) + +void setup(){ + Serial.begin(9600); +} + +void loop(){ + // lecture de la valeur analogique du Gaussmètre (entre 0 et 1024) pour une tension entre 0 et 5V + int aValue = analogRead(PORT_HALL); + //Serial.print(aValue); + + // lecture de la valeur analogique du capteur de force (entre 0 et 1024) pour une tension entre 0 et 5V + int fsrAnalogique = analogRead(PORT_FSR); + + // transforme la valeur de 0 à 1024 vers 0 à 50 + x = map(aValue, 0, 1024, 0, XRANGE); + + // transforme la valeur lue en Gauss + gss = map(aValue, 102, 922, -640, 640); + + // ------ Affichage d'un bargraph sur le moniteur série ---- + /*Serial.print("|"); + for (int i=0;i<x;i++){ + if(i==XRANGE/2-1)Serial.print("|"); + else Serial.print("-"); + } + Serial.print("O"); + for (int i=x+1;i<XRANGE;i++){ + if(i==XRANGE/2-1)Serial.print("|"); + else Serial.print("-"); + } + Serial.print("|");*/ + // ---------------------------------------------------------- + + // affiche la valeur en Gauss + Serial.println(gss); + //Serial.println(" Gauss"); + + // lecture de la valeur analogique (entre 0 et 1023) pour une tension entre 0 et 5V (= 5000mV) + /*fsrVoltage = map(fsrAnalogique, 0, 1023, 0, 5000); + + Serial.print("Lecture de la tension en mV = "); + Serial.println(fsrVoltage); + if (fsrVoltage == 0) { + Serial.println("Aucune pression"); + } else { + // La tension = Vcc * R / (R + FSR) où R = 10K et Vcc = 5V + // d'où FSR = ((Vcc - V) * R) / V + fsrResistance = 5000 - fsrVoltage; // fsrVoltage est en millivolts donc 5V = 5000mV + fsrResistance *= 10000; // 10K resistance + fsrResistance /= fsrVoltage; + Serial.print("FSR resistance en ohms = "); Serial.println(fsrResistance); + + fsrConductance = 1000000; // on mesure en micro-ohm + fsrConductance /= fsrResistance; + Serial.print("Conductance en micro-ohm : "); Serial.println(fsrConductance); + + // Use the two FSR guide graphs to approximate the force + if (fsrConductance <= 1000) { + fsrForce = fsrConductance / 80; + Serial.print("Force en Newtons: "); Serial.println(fsrForce); + } else { + fsrForce = fsrConductance - 1000; + fsrForce /= 30; + Serial.print("Force en Newtons: "); Serial.println(fsrForce); + } + }*/ + + // attendre 1/10 de seconde + delay(200); +} + diff --git a/Raspberry/RecuperationValeur_MQTT.py b/Raspberry/RecuperationValeur_MQTT.py new file mode 100644 index 0000000000000000000000000000000000000000..e166851a19878188adfc27f927ed0e554694e5ca --- /dev/null +++ b/Raspberry/RecuperationValeur_MQTT.py @@ -0,0 +1,54 @@ +############## +## Script listens to serial port and writes contents into a file +############## +## requires pySerial to be installed +import serial +import paho.mqtt.client as mqtt +import time +import sys + +def on_connect(client, userdata, flags, rc): + if rc == 0: + print("Connected to broker") + + global Connected + Connected = True + + else: + print("Connection failed") + +Connected = False + +client = mqtt.Client(transport="websockets") +client.on_connect = on_connect +client.connect("pil-09.univlehavre.lan", 9001, 60) + +client.loop_start() + +while Connected != True: + time.sleep(0.1) + +serial_port = '/dev/ttyACM0'; +baud_rate = 9600; #In arduino, Serial.begin(baud_rate) + +ser = serial.Serial(serial_port, baud_rate) + +try: + while True: + line = ser.readline(); + line = line.decode("utf-8") #ser.readline returns a binary, convert to string + if "-" in line: + prefix = '-' + else: + prefix = '' + + value = ''.join(c for c in line if c.isdigit()) + if value.isdigit(): + value = prefix+value; + print(int(value)); + client.publish("capteurs/gauss1", int(value)); + else: + print("Error bad value", value); +except KeyboardInterrupt: + client.disconnect() + client.loop_stop() diff --git a/VisualisationValeur.py b/VisualisationValeur.py new file mode 100644 index 0000000000000000000000000000000000000000..ef2ddb594914c9a59b0d6d8340a9a97d2c6006aa --- /dev/null +++ b/VisualisationValeur.py @@ -0,0 +1,64 @@ +# UTILISATION + +# sans argument = full time + +# avec argument => +# arg1 = date de debut +# arg2 = date de fin + + +import matplotlib.pyplot as plt +import csv +import sys +from datetime import datetime + +x = [] +y = [] +moy = [] +CONST_MOYENNE = 50 +fullTime = False + +if len(sys.argv) == 1: + fullTime = True +elif len(sys.argv) == 3 : + try: + date1 = datetime.strptime(sys.argv[1], '%Y-%m-%d %H:%M:%S') + date2 = datetime.strptime(sys.argv[2], '%Y-%m-%d %H:%M:%S') + except: + print("Erreur, arguments incorrect. Les dates doivent etre sous la forme \"AAAA-MM-JJ HH-mm-SS\"") + exit(1) +else : + print("Erreur, arguments incorrect. Les dates doivent etre sous la forme \"AAAA-MM-JJ HH-mm-SS\"") + exit(1) + +i = 0 +with open('mytable.csv','r') as csvfile: + next(csvfile, None) + plots = csv.reader(csvfile, delimiter=',') + for row in plots: + if not fullTime: + date = datetime.strptime(row[1],'%Y-%m-%d %H:%M:%S') + if (date1-date).total_seconds() > 0: + continue + + if fullTime or (date2-date).total_seconds() > 0 : + x.append(i) + y.append(int(row[2])) + + if i >= CONST_MOYENNE : + moyenne = 0 + for j in range(i-CONST_MOYENNE, i, 1) : + moyenne = moyenne+y[j] + moy.append(moyenne / CONST_MOYENNE) + + else: + moy.append(int(row[2])) + i = i+1 + +plt.plot(x,y, label='Donnes brut') +plt.plot(x,moy, label='Moyenne mobile (50)') +plt.xlabel('Gauss') +plt.ylabel('temps (200ms)') +plt.title('Astreos') +plt.legend() +plt.show() \ No newline at end of file diff --git a/readme.rst b/readme.rst new file mode 100644 index 0000000000000000000000000000000000000000..ff71fb2a59cc4c1f9c5ec099a35cf7e8fb738794 --- /dev/null +++ b/readme.rst @@ -0,0 +1,21 @@ +# Astreos + +## Lancement d'un test simple + +- Mettre en fonctionnement [Firediag](https://git.litislab.fr/hicham.brahimi/firediag) (Lancer le script [Verification.py](https://git.litislab.fr/hicham.brahimi/firediag/blob/master/Verification.py) en desactivant GenerationDonneesMQTT) + +- Installer et lancer les scripts respectivement dans l'Arduino et le Raspberry Pi +```sh +# Pour le Raspberry Pi +$ source .profile +$ workon cv +$ python RecuperationValeur_MQTT.py & +$ disown # Si lancé par SSH +``` +- Si la BDD est trop grosse pour être lu sur http://website.cs-dc.org/apps/ci1/firediag/index.php/controller/ : + - Exporter la table valeur + ```sh + mysql -u firediag -p ********** -e "select * from valeur;" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > mytable.csv # Ajouter une clause WHERE si plusieurs capteurs + ``` + - Executer [VisualisationValeur.py](https://git.litislab.fr/hicham.brahimi/astreos_arduino/blob/master/VisualisationValeur.py) +