/****************************************************************************/ // Code pour photographie thermique. ATTENTION NE FONCTIONNE PAS AVEC UN ARDUINO DUEMILANOVE ! // inspiré de http://publiclaboratory.org/tool/thermal-photography // et du tutoriel Grove sensor capteur de température IR : http://www.seeedstudio.com/wiki/Grove_-_Infrared_temperature_sensor // // Programme sous licence GNU-GPL // Les Petits Débrouillards 2013 //******************************************************************************/ #include // bibliothèque Math parce que l'on va faire des calculs ! #define SUR_TEMP_PIN A1 // Entrée Analogique pour connecter la broche "SUR" du capteur de température #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(xres[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])&&(voltage100)||(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 }