Projet-ScIn MOOREV_ Trigger-Caméra Modulation Fréquence
INTRODUCTION
Le but de notre projet ARE est de déclencher une caméra Go Pro à l’aide d’une carte électronique Arduino dans le but de récolter des données. Les données qui seront les causes du déclenchement pourront être le pH de l’eau, la température etc. Cela appelle aussi à une adaptation de la caméra au milieu avec un processus d’éclairage la nuit, un potentiel processus de détection des espèces. Le cœur du sujet résidera donc dans le fait de déclencher la caméra sous l’action de certaines conditions nécessaires. Le dessein final serait de mettre le système dans des conditions réelles en milieu extérieur, ce pendant plusieurs jours, afin d’en observer les résultats.
Objectif : Intégration d'une carte mesures de pH + température et d'une Arduino pour la programmation du déclenchement d'une caméra Go Pro autonome.
Il s'agit d'interfaçage de l'Arduino avec les cartes de mesures de pH SENSE0161 (ou ADCM355), avec enregistrement des mesures sur carte microSD, pour pouvoir réveiller la caméra sur un seuil de mesure de température ou de pH.
Matériel fourni :
1 Arduino Nano
1 carte support microSD
2 Cartes mesure SENSE0161 DFRobot avec electrodes pH
2 cartes mesures ADUCM355 WATER QUALITY SENSOR (T°C + pH ou REDOX(ORP)
2 sondes T°C long. 30 cm - thermistance (Thermocoax)
Code pour déterminer la température
/*
* Created by ArduinoGetStarted.com
*
* This example code is in the public domain
*
* Tutorial page: https://arduinogetstarted.com/tutorials/arduino-temperature-sensor
*/
#include <OneWire.h>
#include <DallasTemperature.h>
const int SENSOR_PINsensorPin = 13;A0;
const float refResistor = 5600; // Arduinovaleur pinde connectedla torésistance DS18B20de sensor'sréférence DQen pinOhms
OneWireconst oneWire(SENSOR_PIN);float thermistorNominal = 10000; // setupvaleur anominale oneWirede instancela DallasTemperaturethermistance tempSensor(&oneWire);en Ohms
const float tempNominal = 25.0; // passtempérature oneWirenominale tode DallasTemperaturela librarythermistance en degrés Celsius
const float tempCelsius;bCoefficient = 3950; // temperaturecoefficient inb Celsiusde la thermistance
const float tempFahrenheit;voltage = 5.0; // temperaturetension ind'alimentation Fahrenheitde la sonde en volts
void setup() {
Serial.begin(9600);
// initialize serial
tempSensor.begin(); // initialize the sensor
}
void loop() {
tempSensor.requestTemperatures();int // send the command to get temperatures
tempCelsiussensorValue = tempSensor.getTempCByIndex(analogRead(sensorPin);
float resistance = refResistor * (1023.0 / sensorValue - 1.0);
// readfloat temperature in Celsius
tempFahrenheit = tempCelsius * 91.0 / 5(log(resistance / thermistorNominal) / bCoefficient + 32;1.0 // convert(tempNominal Celsius+ to273.15)) Fahrenheit- 273.15;
Serial.print("Temperature: ");
Serial.print(tempCelsius)temperature); // print the temperature in Celsius
Serial.print("°C");
Serial.print(" ~ "); // separator between Celsius and Fahrenheit
Serial.print(tempFahrenheit); // print the temperature in Fahrenheit
Serial.println("°F" degrees Celsius");
delay(500)1000);
}
Code de déclenchement de caméra
#include <OneWire.h>
// Définir la broche de données pour le capteur DS18B20
#define ONE_WIRE_BUS 2
// Initialiser l'objet OneWire
OneWire oneWire(ONE_WIRE_BUS);
void setup() {
// Ouvrir une communication série à 9600 bauds
Serial.begin(9600);
}
void loop() {
// Initialiser le capteur
byte addr[8];
if (!oneWire.search(addr)) {
// Si aucun capteur n'est détecté, attendre
delay(1000);
return;
}
// VĂ©rifier que le capteur est bien un DS18B20
if (addr[0] != 0x28) {
// Si ce n'est pas un DS18B20, attendre
delay(1000);
return;
}
// Initialiser la communication avec le capteur
oneWire.reset();
oneWire.select(addr);
oneWire.write(0x44); // Lancer la conversion de température
// Attendre la fin de la conversion
delay(1000);
// Lire la température
oneWire.reset();
oneWire.select(addr);
oneWire.write(0xBE); // Demander la lecture de la température
byte data[9];
for (byte i = 0; i < 9; i++) {
data[i] = oneWire.read();
}
int temp_raw = (data[1] << 8) | data[0];
float temp_celsius = (float) temp_raw / 16.0;
// Afficher la température
Serial.print("Température: ");
Serial.print(temp_celsius);
Serial.println(" °C");
// Attendre avant de recommencer
delay(1000);
}
Code pour avoir le pH
/*
# This sample code is used to test the pH meter V1.0.
# Editor : YouYou
# Ver : 1.0
# Product: analog pH meter
# SKU : SEN0161
*/
#define SensorPin A0 //pH meter Analog output to Arduino Analog Input 0
#define Offset 0.00 //deviation compensate
#define LED 13
#define samplingInterval 20
#define printInterval 800
#define ArrayLenth 40 //times of collection
int pHArray[ArrayLenth]; //Store the average value of the sensor feedback
int pHArrayIndex=0;
void setup(void)
{
pinMode(LED,OUTPUT);
Serial.begin(9600);
Serial.println("pH meter experiment!"); //Test the serial monitor
}
void loop(void)
{
static unsigned long samplingTime = millis();
static unsigned long printTime = millis();
static float pHValue,voltage;
if(millis()-samplingTime > samplingInterval)
{
pHArray[pHArrayIndex++]=analogRead(SensorPin);
if(pHArrayIndex==ArrayLenth)pHArrayIndex=0;
voltage = avergearray(pHArray, ArrayLenth)*5.0/1024;
pHValue = 3.5*voltage+Offset;
samplingTime=millis();
}
if(millis() - printTime > printInterval) //Every 800 milliseconds, print a numerical, convert the state of the LED indicator
{
Serial.print("Voltage:");
Serial.print(voltage,2);
Serial.print(" pH value: ");
Serial.println(pHValue,2);
digitalWrite(LED,digitalRead(LED)^1);
printTime=millis();
}
}
double avergearray(int* arr, int number){
int i;
int max,min;
double avg;
long amount=0;
if(number<=0){
Serial.println("Error number for the array to avraging!/n");
return 0;
}
if(number<5){ //less than 5, calculated directly statistics
for(i=0;i<number;i++){
amount+=arr[i];
}
avg = amount/number;
return avg;
}else{
if(arr[0]<arr[1]){
min = arr[0];max=arr[1];
}
else{
min=arr[1];max=arr[0];
}
for(i=2;i<number;i++){
if(arr[i]<min){
amount+=min; //arr<min
min=arr[i];
}else {
if(arr[i]>max){
amount+=max; //arr>max
max=arr[i];
}else{
amount+=arr[i]; //min<=arr<=max
}
}//if
}//for
avg = (double)amount/(number-2);
}//if
return avg;
}
Code de déclenchement avec pH
// Inclure la bibliothèque pour la communication série
#include <SoftwareSerial.h>
// Définir les broches de communication série
SoftwareSerial pHSerial(2, 3); // RX, TX
// Définir la broche de commande de la caméra
const int cameraPin = 4;
// DĂ©finir les constantes pour la calibration du capteur de pH
const float pH7Voltage = 2.5;
const float pH4Voltage = 1.98;
const float pH10Voltage = 3.07;
// Fonction pour convertir la tension en pH
float convertToPH(float voltage) {
float pH = 7 - (voltage - pH7Voltage) / (pH7Voltage - pH4Voltage) * 3;
return pH;
}
void setup() {
// Ouvrir la communication série pour le débogage
Serial.begin(9600);
// Configurer la communication série pour le capteur de pH
pHSerial.begin(9600);
// Définir la broche de commande de la caméra en mode sortie
pinMode(cameraPin, OUTPUT);
}
void loop() {
// Lire la tension du capteur de pH
pHSerial.write('R'); // Envoyer la commande pour lire la tension
delay(1000); // Attendre la réponse
while (pHSerial.available() < 4) {} // Attendre la réponse complète
float voltage = (float)pHSerial.parseFloat() / 1000.0; // Convertir la réponse en voltage
// Convertir la tension en pH
float pH = convertToPH(voltage);
// Afficher les résultats
Serial.print("Voltage = ");
Serial.print(voltage, 2);
Serial.print(" V, pH = ");
Serial.print(pH, 2);
Serial.println();
// Déclencher la caméra si le pH est inférieur à 7
if (pH < 7) {
digitalWrite(cameraPin, HIGH);
delay(500);
digitalWrite(cameraPin, LOW);
}
// Attendre une seconde avant de recommencer
delay(1000);
}
⚠LesSeul codesle ci-dessuscode restentpH à tester, aucune manipulation n'a été faitestesté (OnBien que les valeurs semblent surprenant, le code de déclenchement n'a pas eupu accèsêtre à notre boite snif snif 🥲🥲testé).
BIBLIOGRAPHIE
-
Analog Input | Arduino Documentation. https://docs.arduino.cc/built-in-examples/analog/AnalogInput. Consulté le 30 mars 2023.
-
analogRead() - Arduino Reference. https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/. Consulté le 30 mars 2023.
-
Nano | Arduino Documentation. https://docs.arduino.cc/hardware/nano. Consulté le 30 mars 2023.
-
SPI - Arduino Reference. https://www.arduino.cc/reference/en/language/functions/communication/spi/. Consulté le 30 mars 2023.
-
WiFi101 - Arduino Reference. https://www.arduino.cc/reference/en/libraries/wifi101/. Consulté le 30 mars 2023.
-
« Arduino - Temperature Sensor | Arduino Tutorial ». Arduino Getting Started, https://arduinogetstarted.com/tutorials/arduino-temperature-sensor. Consulté le 30 mars 2023.
-
DS18B20 Temperature Sensor For Arduino - DFRobot Wiki. https://wiki.dfrobot.com/Gravity__DS18B20_Temperature_Sensor__Arduino_Compatible__V2_SKU__DFR0024. Consulté le 30 mars 2023.
- SKU SEN0161 PH Meter. https://wiki.dfrobot.com/PH_meter_SKU__SEN0161_. Consulté le 7 avril 2023.