Photo Thermique à base d'arduino : Différence entre versions

(update property name)
Ligne 12 : Ligne 12 :
 
}}
 
}}
 
{{Materials}}
 
{{Materials}}
{{Separator}}
 
 
{{Tuto Step
 
{{Tuto Step
 
|Step_Title=Realiser
 
|Step_Title=Realiser
|Step_Content=Réalisez le montage comme décris ci-dessous.
+
|Step_Content=Réalisez le montage comme décris ci-contre.
  
Uploadez le programme ci-dessous dans votre arduino. Afin d'avoir des résultats visibles, c'est à dire des couleurs bleues pour les zones froides et rouges pour les zones chaudes, bien contrastées , effectuez des mesures sur votre mur ou objet afin d'avoir un ordre de grandeur des températures à détecter.
+
Uploadez le programme ci-joint dans votre arduino. Afin d'avoir des résultats visibles, c'est à dire des couleurs bleues pour les zones froides et rouges pour les zones chaudes, bien contrastées , effectuez des mesures sur votre mur ou objet afin d'avoir un ordre de grandeur des températures à détecter.
  
/****************************************************************************/
+
<br />
// Code pour photographie thermique. ATTENTION NE FONCTIONNE PAS AVEC UN ARDUINO DUEMILANOVE !
 
// inspiré de <nowiki>http://publiclaboratory.org/tool/thermal-photography</nowiki>
 
// et du tutoriel Grove sensor capteur de température IR : <nowiki>http://www.seeedstudio.com/wiki/Grove_-_Infrared_temperature_sensor</nowiki>
 
//
 
// Programme sous licence GNU-GPL
 
// Les Petits Débrouillards 2013
 
//******************************************************************************/
 
<nowiki>#</nowiki>include <math.h> // bibliothèque Math parce que l'on va faire des calculs !
 
<nowiki>#</nowiki>define SUR_TEMP_PIN A1 // Entrée Analogique pour connecter la broche "SUR" du capteur de température
 
<nowiki>#</nowiki>define OBJ_TEMP_PIN A0 // Entrée Analogique pour connecter la broche "OBJ" du capteur de température
 
/// Réglage de la température minimale et maximale
 
const float lowReading = 0;
 
const float highReading = 45;
 
//Parametres de calibrage du capteur IR ///////////////////////////
 
float temp_calibration=0;      //this parameter was used to calibrate the temperature
 
//float objt_calibration=0.000; //this parameter was used to calibrate the object temperature
 
float temperature_range=10;    //we make a map of temperature-voltage according to sensor datasheet. 10 is the temperature step when sensor and
 
//object distance is 9CM.
 
float offset_vol=0.014;        //this parameter was used to set the mid level voltage,when put the sensor in normal environment after 10 min,
 
//the sensor output 0.For example,the surrounding temperature is 29℃,but the result is 27℃ via the sensor,
 
//you should set the reerence to 0.520 or more,according to your sensor to change.
 
//the unit is V
 
float tempValue = 0;
 
float objtValue= 0; 
 
float current_temp=0;
 
float temp=0;
 
float temp1=0;
 
float temp2=0;
 
unsigned int temp3=0;
 
const float reference_vol=0.500;
 
unsigned char clear_num=0;//when use lcd to display
 
float R=0;
 
float voltage=0;
 
long res[100]={
 
318300,302903,288329,274533,261471,249100,237381,226276,215750,205768,
 
196300,187316,178788,170691,163002,155700,148766,142183,135936,130012,
 
124400,119038,113928,109059,104420,100000,95788,91775,87950,84305,
 
80830,77517,74357,71342,68466,65720,63098,60595,58202,55916,
 
53730,51645,49652,47746,45924,44180,42511,40912,39380,37910,
 
36500,35155,33866,32631,31446,30311,29222,28177,27175,26213,
 
25290,24403,23554,22738,21955,21202,20479,19783,19115,18472,
 
17260,16688,16138,15608,15098,14608,14135,13680,13242,12819,
 
12412,12020,11642,11278,10926,10587,10260,9945,9641,9347,
 
9063,8789,8525,8270,8023,7785,7555,7333,7118,6911};
 
float obj [13][12]={
 
/*0*/  {
 
0,-0.274,-0.58,-0.922,-1.301,-1.721,-2.183,-2.691,-3.247,-3.854,-4.516,-5.236  }
 
  , //
 
/*1*/  {
 
0.271,0,-0.303,-0.642,-1.018,-1.434,-1.894,-2.398,-2.951,-3.556,-4.215,-4.931  }
 
  ,  //→surrounding temperature,from -10,0,10,...100
 
/*2*/  {
 
0.567,0.3,0,-0.335,-0.708,-1.121,-1.577,-2.078,-2.628,-3.229,-3.884,-4.597  }
 
  ,  //↓object temperature,from -10,0,10,...110
 
/*3*/  {
 
0.891,0.628,0.331,0,-0.369,-0.778,-1.23,-1.728,-2.274,-2.871,-3.523,-4.232  }
 
,
 
/*4*/  {
 
1.244,0.985,0.692,0.365,0,-0.405,-0.853,-1.347,-1.889,-2.482,-3.13,-3.835  }
 
,
 
/*5*/  {
 
1.628,1.372,1.084,0.761,0.401,0,-0.444,-0.933,-1.47,-2.059,-2.702,-3.403  }
 
,
 
/*6*/  {
 
2.043,1.792,1.509,1.191,0.835,0.439,0,-0.484,-1.017,-1.601,-2.24,-2.936  }
 
,
 
/*7*/  {
 
2.491,2.246,1.968,1.655,1.304,0.913,0.479,0,-0.528,-1.107,-1.74,-2.431  }
 
,
 
/*8*/  {
 
2.975,2.735,2.462,2.155,1.809,1.424,0.996,0.522,0,-0.573,-1.201,-1.887  }
 
,
 
/*9*/  {
 
3.495,3.261,2.994,2.692,2.353,1.974,1.552,1.084,0.568,0,-0.622,-1.301  }
 
,
 
/*10*/  {
 
4.053,3.825,3.565,3.27,2.937,2.564,2.148,1.687,1.177,0.616,0,-0.673  }
 
,
 
/*11*/  {
 
4.651,4.43,4.177,3.888,3.562,3.196,2.787,2.332,1.829,1.275,0.666,0  }
 
,
 
/*12*/  {
 
5.29,5.076,4.83,4.549,4.231,3.872,3.47,3.023,2.527,1.98,1.379,0.72  }
 
};
 
const unsigned char separatorCharacter = 255;
 
////////////////////////////////////////////////////////////////////
 
void setup()
 
{
 
  Serial.begin(9600); // Initialisation de la communication série à 9600 bauds
 
//(mega only)set the refenrence voltage 1.1V,the distinguishability can up to 1mV.
 
pinMode(9,OUTPUT);
 
pinMode(10,OUTPUT);
 
pinMode(11,OUTPUT);
 
}
 
void loop()
 
{
 
analogReference(INTERNAL);
 
  measureSurTemp();//measure the Surrounding temperature around the sensor
 
measureObjectTemp();
 
float state = normf(measureObjectTemp(), lowReading, highReading);
 
  int hue = map(state,0,255,(360.00*0.60),0); // transformation de la température en couleur
 
analogReference(DEFAULT);
 
  setLedColorHSV(hue,1,1); //commande de la led
 
Serial.println(temp);
 
}
 
float binSearch(long x)// this function used for measure the surrounding temperature
 
{
 
int low,mid,high;
 
low=0;
 
  //mid=0;
 
high=100;
 
while (low<=high)
 
{
 
mid=(low+high)/2;
 
if(x<res[mid])
 
low= mid+1;
 
else//(x>res[mid])
 
high=mid-1;
 
}
 
return mid;
 
}
 
float arraysearch(float x,float y)//x is the surrounding temperature,y is the object temperature
 
{
 
int i=0;
 
  float tem_coefficient=100;//Magnification of 100 times
 
  i=(x/10)+1;//Ambient temperature
 
  voltage=(float)y/tem_coefficient;//the original voltage
 
  //Serial.print("sensor voltage:\t");
 
  //Serial.print(voltage,5);
 
  //Serial.print("V");
 
for(temp3=0;temp3<13;temp3++)
 
{
 
if((voltage>obj[temp3][i])&&(voltage<obj[temp3+1][i]))
 
{
 
return temp3;
 
}
 
}
 
}
 
float measureSurTemp()
 
 
unsigned char i=0;
 
float current_temp1=0;  
 
int signal=0;  
 
tempValue=0;
 
  for(i=0;i<10;i++)      //  
 
{  
 
tempValue+= analogRead(SUR_TEMP_PIN);  
 
delay(10);  
 
}  
 
tempValue=tempValue/10;  
 
temp = tempValue*1.1/1023;  
 
R=2000000*temp/(2.50-temp);  
 
signal=binSearch(R);  
 
current_temp=signal-1+temp_calibration+(res[signal-1]-R)/(res[signal-1]-res[signal]);
 
  //Serial.print("Surrounding temperature:");
 
  //Serial.print(current_temp);
 
return current_temp;
 
}
 
float measureObjectTemp()
 
{
 
unsigned char i=0; 
 
unsigned char j=0; 
 
float sur_temp=0; 
 
unsigned int array_temp=0; 
 
float temp1,temp2;
 
float final_temp=0;
 
objtValue=0;
 
for(i=0;i<10;i++)
 
{
 
objtValue+= analogRead(OBJ_TEMP_PIN);
 
delay(10);
 
}     
 
  objtValue=objtValue/10;//Averaging processing   
 
  temp1=objtValue*1.1/1023;//+objt_calibration;
 
sur_temp=temp1-(reference_vol+offset_vol);           
 
  //Serial.print("\t Sensor voltage:");
 
  //Serial.print(sur_temp,3);
 
  //Serial.print("V");
 
array_temp=arraysearch(current_temp,sur_temp*1000);       
 
temp2=current_temp;       
 
temp1=(temperature_range*voltage)/(obj[array_temp+1][(int)(temp2/10)+1]-obj[array_temp][(int)(temp2/10)+1]);       
 
final_temp=temp2+temp1;       
 
if((final_temp>100)||(final_temp<=-10))
 
{
 
Serial.println ("\t out of range!");
 
}
 
else
 
{
 
Serial.print("\t object temperature:");
 
Serial.println(final_temp,2);
 
return final_temp;
 
}
 
}
 
float normf(float x, float low, float high) {
 
float y = (x - low) * 255.f / (high - low);
 
if(y > 255) {
 
y = 255;
 
}
 
if(y < 0) {
 
y = 0;
 
}
 
return y;
 
}
 
void setLedColorHSV(int h, double s, double v) {
 
  //this is the algorithm to convert from RGB to HSV
 
double r=0;
 
double g=0;
 
double b=0;
 
double hf=h/60.0;
 
int i=(int)floor(h/60.0);
 
double f = h/60.0 - i;
 
double pv = v * (1 - s);
 
double qv = v * (1 - s*f);
 
double tv = v * (1 - s * (1 - f));
 
switch (i)
 
{
 
  case 0: //rojo dominante
 
r = v;
 
g = tv;
 
b = pv;
 
break;
 
  case 1: //verde
 
r = qv;
 
g = v;
 
b = pv;
 
break;
 
case 2:
 
r = pv;
 
g = v;
 
b = tv;
 
break;
 
  case 3: //azul
 
r = pv;
 
g = qv;
 
b = v;
 
break;
 
case 4:
 
r = tv;
 
g = pv;
 
b = v;
 
break;
 
  case 5: //rojo
 
r = v;
 
g = pv;
 
b = qv;
 
break;
 
}
 
  //set each component to a integer value between 0 and 255
 
int red=constrain((int)255*r,0,255);
 
int green=constrain((int)255*g,0,255);
 
int blue=constrain((int)255*b,0,255);
 
setLedColor(red,green,blue);
 
}
 
//Sets the current color for the RGB LED
 
void setLedColor(int red, int green, int blue) {
 
  //Note that we are reducing 1/4 the intensity for the green and blue components because
 
  //  the red one is too dim on my LED. You may want to adjust that.
 
  analogWrite(11,red); //broche du rouge en 9
 
  analogWrite(10,green); //broche du vert en 10
 
  analogWrite(9,blue); //broche du bleu en 11
 
}
 
 
|Step_Picture_00=Photo_Thermique_à_base_d'arduino_750px-Montage_photo_thermique.png
 
|Step_Picture_00=Photo_Thermique_à_base_d'arduino_750px-Montage_photo_thermique.png
 
}}
 
}}
Ligne 342 : Ligne 80 :
 
|Complete=Draft
 
|Complete=Draft
 
}}
 
}}
 +
{{Separator}}

Version du 4 septembre 2020 à 08:42

Auteur avatarTess | Dernière modification 4/09/2020 par Julienrat

Photo Thermique à base d'arduino Animation scan.gif

Introduction

Comment prendre des photographies thermiques ? Ce petit montage peu coûteux comparé au prix d'une caméra dédiée à la photographie thermique, se base sur la technique du "light painting".

Étape 1 - Realiser

Réalisez le montage comme décris ci-contre.

Uploadez le programme ci-joint dans votre arduino. Afin d'avoir des résultats visibles, c'est à dire des couleurs bleues pour les zones froides et rouges pour les zones chaudes, bien contrastées , effectuez des mesures sur votre mur ou objet afin d'avoir un ordre de grandeur des températures à détecter.





Étape 2 - Suite

et ensuite modifiez les deux premières variables :

const float lowReading = 0; // température basse en degrés (bleu) const float highReading = 35; // température haute en degrés (rouge)

Une fois le montage réalisé, scotchez le capteur de température infrarouge bien parallèle à la led RGB. insérer la photo du montage scotché !

Vérifiez avec votre main en face du capteur que la led change de couleur, si ce n'est pas le cas, controlez votre montage et/ou modifiez les parametres de température haute et basse.

Étape 3 -

La manipulation

Réglez votre appareil photo en mode Manuel, puis l'ouverture à F7.1 et le temps d'exposition de 30 secondes sensibilité 200 ISO




Étape 4 -

Dans une pièce noir, positionnez votre appareil photo en face de la partie du mur à "scanner". Déclenchez votre appareil photo, et balayez à environ 10 cm toute la surface du mur.




Étape 5 - Resultat



Comment ça marche ?

Observations : que voit-on ?

Après 30 secondes de pose, vous devriez obtenir un resultat ressemblant à ceci : ci dessus

Explications

De manière simple

Le programme chargé dans votre arduino capte la température infrarouge d'un objet puis le transforme en couleur. En plaçant un appareil photo avec un temps de pose relativement long et en balayant le mur à l'aide de votre montage eclairant, vous effectuez du light painting ! Mais pas n’importe quel light painting, vous peignez des températures !

La photo prise à l'aide de votre reflex est tintée de couleurs correspondantes à la température de votre objet, le rouge pour les températures chaudes et le bleu pour les températures froides.

Vous venez ainsi de réaliser une photo thermique !

Applications : dans la vie de tous les jours

Selon Wikipédia (http://fr.wikipedia.org/wiki/Cam%C3%A9ra_thermique)

Une caméra thermique peut être utilisée dans différentes situations. Cette liste n'est donc pas exhaustive :

  • Pour les sapeurs-pompiers :
    • recherche de victimes lors de feux d’appartements et surtout dans de grands volumes tels que parkings souterrains, usines, halls de stockage, feu de forêt…
    • recherche de foyer : la caméra thermique permet de détecter très rapidement un foyer ou même un feu couvant
    • feu ou foyer résiduel dans un joint de dilatation suite à un feu de cave dans un immeuble collectif type barre d’habitation,
    • point chaud après extinction d’un feu de cheminée ou de comble,
    • feu électrique : court-circuit, faux-contact entrainant une surchauffe ponctuelle
    • lors du dépotage de wagons ou de citerne, le niveau dans la cuve de certains produits chimiques peut être observé à l'aide de la caméra thermique
    • lors d'une intervention pour un accident de la circulation de nuit en campagne, pour détecter un éventuel corps éjecté hors de la route
    • en sauvetage déblaiement, pour localiser une victime dans un local accessible par une petite ouverture
Les modèles ne sont en général pas antidéflagrants et ne peuvent donc pas être engagées dans les ambiances explosives.
  • Pour l'armée et les services de police : pour les opérations de nuit ;
  • récemment, des exploitants de salles de cinéma aux États-Unis ont équipé leurs personnels de caméras thermiques afin de détecter les personnes filmant les projections depuis la salle (screening).
  • Pour le bâtiment:
    • Détection des points faibles de l'isolation d'un bâtiment.
    • Vérification des températures des canalisations et installations de chauffage, notamment pour le contrôle des planchers chauffants.
    • Vérification des armoires électriques par visualisation des surchauffes des connexions, ou de certains composants.
  • Pour les aéroports :
    • Pour vérifier les personnes ayant une fièvre suspecte.
  • Dans le domaine médical (ex: Thermographie)


Dernière modification 4/09/2020 par user:Julienrat.

Commentaires

Draft