|
|
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}} |