Go Down

Topic: point de rosée pour astronomie (Read 3021 times) previous topic - next topic

Artouste


oui c'est du résistif, je viens de la connecter sur une batterie, mais ca chauffe que dalle en 12v.
ohmmetre 1K, donc c'est un peu mort avec ca je dirais.

EDIT :
après quelques minutes, je monte d'un tout petit degré avec une temp ambiante de 21C, a tester dans mon tube en mousse pour vérifier si ca monte un peu plus.
mais si ca monte ne serait ce que de 0.5C maxi dans le tube, le tour est joué quand même.
je ferais des tests ce soir pour vérifier la chose


Bonjour infobarquee
j'ai discuté avec un collegue astrome amateur
Je n'ai pas bien su lui expliquer où tu voulais eviter la condensation, mais lui utilise maintenant du ruban cuivre autocollant
comme ça (je le soupçonne de taper dans le stock)  :smiley-mr-green:
http://cjoint.com/13oc/CJCqlm7ZDqA_img_0001a.jpg
le calcul de resistance est simple à faire les parametres dimensionnels etant connu
l L epaisseur Cu

infobarquee

oui, il y a cette solution aussi.
j'ai plus la formule en tête pour déterminer les watts a avoir suivant le diamètre de la lunette à sa sortie.

Artouste


oui, il y a cette solution aussi.
j'ai plus la formule en tête pour déterminer les watts a avoir suivant le diamètre de la lunette à sa sortie.

comme on est en là thermodynamique quasi stable
ce qui compte surtout c'est le volume à maintenir et stabiliser en température.

infobarquee


comme on est en là thermodynamique quasi stable
ce qui compte surtout c'est le volume à maintenir et stabiliser en température.


http://www.astrosurf.com/jpbousquet/resistances.htm
http://www.astrosurf.com/d_bergeron/astronomie/Bibliotheque/Chauffe_oculaire/chauffe_oculaire.htm
j'ai pas ce genre de conducteur en stock, ou alors je le sais pas :(
voilà un exemple.
après, on a un parebuée que l'on met en bout pour limiter la casse.
en général il est égal à la longueur du tube.

maintenir la temp, n'est pas forcément la meilleur solution, le tout est d'avoir un point de rosée inférieur à la temp.
certes, par certaines temp, le système est en route en permanence, mais c'est rare.

infobarquee

un copain a fait un chauffage en utilisant des R.
bon, ca fonctionne, mais ca me plait pas du tout, surtout que ca chauffe plus au niveau des soudures et que ca bouffe 1A.
ca veut dire 2 batteries, une pour la monture (AZ pour ma part) et l'autre pour le chauffage.
je pense que je vais partir sur un autre type de montage.
un ventilo avec une résistance afin de faire une surpression dans le pare buée en asséchant l'air par la même occasion.
je vais modifier mon prog en fonction de cette idée.
un petit ventilo de pc en 5v et une résistance.

mais suis idiot (ne riez pas), pourquoi ne pas me servir d'un lm7805 avec son radiateur pour alimenter le ventilo et par la même occase chauffer l'air. vu qu'il va bien chauffer, ca va faire un peut comme un sèche cheveux :)
faudra juste ne pas faire de photo pendant que ca tourne, car les vibrations vont faire tache.

infobarquee

alors, vendredi soir, test en live à blanc pour valider les affichages.
ca le fait, mais il faut que je modifie encore certaines choses.
le code est brut de pomme, mais tout est opérationnel

infobarquee

#21
Nov 17, 2013, 10:24 pm Last Edit: Nov 18, 2013, 12:10 am by infobarquee Reason: 1
Code: [Select]
#include <DHT.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>  
Adafruit_BMP085 bmp;
#define DHTTYPE DHT22  
#define DHTPIN A1
DHT dht(DHTPIN, DHTTYPE);
#include "LCD4884.h"
#include "DFrobot_bmp.h"
#include "DFrobot_chinese.h"
//keypad debounce parameter
#define DEBOUNCE_MAX 15
#define DEBOUNCE_ON  10
#define DEBOUNCE_OFF 3
#define NUM_KEYS 5
#define NUM_MENU_ITEM 5

// joystick number
#define LEFT_KEY 0
#define CENTER_KEY 1
#define DOWN_KEY 2
#define RIGHT_KEY 3
#define UP_KEY 4

// menu starting points
#define MENU_X 10
#define MENU_Y 1

int  adc_key_val[5] ={
 50, 200, 400, 600, 800 };

// debounce counters
byte button_count[NUM_KEYS];
// button status - pressed/released
byte button_status[NUM_KEYS];
// button on flags for user program
byte button_flag[NUM_KEYS];

// menu definition
char menu_items[NUM_MENU_ITEM][12]={
 "TEMPERATURE",
 "HYGROMETRIE",
 "ALTITUDE",
 "POINT_ROSEE",
 "VENTILO"
};


void (*menu_funcs[NUM_MENU_ITEM])(void) = {
 temperature,
 hygrometrie,
 altitude,
 about,
 ventilo
};

char current_menu_item;

#define led 13
#define led1 12
#define chauffage 11

 int pointrosee ;
 char pointroseeBuf[8];
 int temp ;
 char tempBuf[8];
 int hum ;
 char humBuf[8];

void setup()
{
pinMode(led,OUTPUT);
pinMode(led1,OUTPUT);
pinMode(chauffage, OUTPUT);
 // setup interrupt-driven keypad arrays  
 // reset button arrays
 for(byte i=0; i<NUM_KEYS; i++){
   button_count[i]=0;
   button_status[i]=0;
   button_flag[i]=0;
 }

 // Setup timer2 -- Prescaler/256
 TCCR2A &= ~((1<<WGM21) | (1<<WGM20));
 TCCR2B &= ~(1<<WGM22);
 TCCR2B = (1<<CS22)|(1<<CS21);      

 ASSR |=(0<<AS2);

 // Use normal mode  
 TCCR2A =0;    
 //Timer2 Overflow Interrupt Enable  
 TIMSK2 |= (0<<OCIE2A);
 TCNT2=0x6;  // counting starts from 6;  
 TIMSK2 = (1<<TOIE2);    

 SREG|=1<<SREG_I;
 lcd.LCD_init();
 lcd.LCD_clear();
 //menu initialization
 init_MENU();
 current_menu_item = 0;

 lcd.backlight(ON);//Turn on the backlight
 //lcd.backlight(OFF); // Turn off the backlight  
     dht.begin();
 // Sensor init
if (!bmp.begin()) {
 Serial.println("No valid BMP085 sensor found!");
 while (true) {}
}
}

void loop()
{
 analogWrite(chauffage,0);
 byte i;
 for(i=0; i<NUM_KEYS; i++){
   if(button_flag[i] !=0){

     button_flag[i]=0;  // reset button flag
     switch(i){

     case UP_KEY:
       // current item to normal display
       lcd.LCD_write_string(MENU_X, MENU_Y + current_menu_item, menu_items[current_menu_item], MENU_NORMAL );
       current_menu_item -=1;
       if(current_menu_item <0)  current_menu_item = NUM_MENU_ITEM -1;
       // next item to highlight display
       lcd.LCD_write_string(MENU_X, MENU_Y + current_menu_item, menu_items[current_menu_item], MENU_HIGHLIGHT );
       break;
     case DOWN_KEY:
       // current item to normal display
       lcd.LCD_write_string(MENU_X, MENU_Y + current_menu_item, menu_items[current_menu_item], MENU_NORMAL );
       current_menu_item +=1;
       if(current_menu_item >(NUM_MENU_ITEM-1))  current_menu_item = 0;
       // next item to highlight display
       lcd.LCD_write_string(MENU_X, MENU_Y + current_menu_item, menu_items[current_menu_item], MENU_HIGHLIGHT );
       break;
     case LEFT_KEY:
       init_MENU();
       current_menu_item = 0;
       break;  
     case CENTER_KEY:
       lcd.LCD_clear();
       (*menu_funcs[current_menu_item])();
       lcd.LCD_clear();
       init_MENU();
       current_menu_item = 0;          
       break;
     }

   }
 }
 
lecture();
 
 while(tempBuf == pointroseeBuf || hum > 90 ){
   lecture();

//lcd.backlight(OFF);
digitalWrite(led,1);
digitalWrite(led1,0);
analogWrite(chauffage,255);

lcd.LCD_write_string(10, 1, tempBuf, MENU_NORMAL);
 lcd.LCD_write_string(10, 2, humBuf, MENU_NORMAL);

//   lcd.LCD_write_string(38, 5, "OK", MENU_HIGHLIGHT );
// waitfor_OKkey();
 }

digitalWrite(led,0);
digitalWrite(led1,1);
}

/* menu functions */

void init_MENU(void){

 byte i;
 lcd.LCD_clear();
 lcd.LCD_write_string(MENU_X, MENU_Y, menu_items[0], MENU_HIGHLIGHT );
 for (i=1; i<NUM_MENU_ITEM; i++){
   lcd.LCD_write_string(MENU_X, MENU_Y+i, menu_items[i], MENU_NORMAL);
 }

}

// waiting for center key press
void waitfor_OKkey(){
 byte i;
 byte key = 0xFF;
 while (key!= CENTER_KEY){
   for(i=0; i<NUM_KEYS; i++){
     if(button_flag[i] !=0){
       button_flag[i]=0;  // reset button flag
       if(i== CENTER_KEY) key=CENTER_KEY;
     }
   }
 }

}

void temperature()
{
   float t = dht.readTemperature();
    char tempBuf[6]="";
 sprintf(tempBuf, "%d",(int)t);
   lcd.LCD_write_string_big(10, 1,tempBuf, MENU_NORMAL);
 lcd.LCD_write_string(78, 2, "C", MENU_NORMAL);
 lcd.LCD_write_string(38, 5, "OK", MENU_HIGHLIGHT );
 waitfor_OKkey();
}

void hygrometrie(){
   float h = dht.readHumidity();
 char humBuf[6];
 sprintf(humBuf, "%d",(int)h);
   lcd.LCD_write_string_big(10, 1,humBuf, MENU_NORMAL);
 lcd.LCD_write_string(78, 2, "%", MENU_NORMAL);
 lcd.LCD_write_string(38, 5, "OK", MENU_HIGHLIGHT );
 waitfor_OKkey();
   }

void altitude(){
    int pression = bmp.readAltitude();
 char pressionBuf[8];
 sprintf(pressionBuf, "%d",pression);  
 lcd.LCD_write_string_big(1, 1,pressionBuf, MENU_NORMAL);
 lcd.LCD_write_string(78, 2, "M", MENU_NORMAL);
 lcd.LCD_write_string(38, 5, "OK", MENU_HIGHLIGHT );
 waitfor_OKkey();
}

void about(){
 float h = dht.readHumidity();
 float t = dht.readTemperature();
 int point_rosee = dewPoint(t, h);
 char point_roseeBuf[8];
 sprintf(point_roseeBuf, "%d",point_rosee);
   int point_rosee_fast = dewPointFast(t, h);
 char point_rosee_fastBuf[8];
 sprintf(point_rosee_fastBuf, "%d",point_rosee_fast);
   lcd.LCD_write_string( 0, 20, point_rosee_fastBuf, MENU_NORMAL);
 lcd.LCD_write_string( 15, 20, "C", MENU_NORMAL);
   lcd.LCD_write_string( 23, 20, "PR Fast", MENU_NORMAL);
   lcd.LCD_write_string( 0, 1, point_roseeBuf, MENU_NORMAL);
 lcd.LCD_write_string( 15, 1, "C", MENU_NORMAL);
   lcd.LCD_write_string( 23, 1, "P.rosee", MENU_NORMAL);
 lcd.LCD_write_string(38, 5, "OK", MENU_HIGHLIGHT );
 waitfor_OKkey();
}

void ventilo(){
  lcd.LCD_write_string(0, 1,"Ventilo", MENU_NORMAL);
 lcd.LCD_write_string(38, 5, "OK", MENU_HIGHLIGHT );
 digitalWrite(led,1);
digitalWrite(led1,0);
analogWrite(chauffage, 255);
 waitfor_OKkey();
}
// The followinging are interrupt-driven keypad reading functions
// which includes DEBOUNCE ON/OFF mechanism, and continuous pressing detection

// Convert ADC value to key number
char get_key(unsigned int input)
{
 char k;
 for (k = 0; k < NUM_KEYS; k++)
 {
   if (input < adc_key_val[k])
   {
     return k;
   }
 }
 if (k >= NUM_KEYS)
   k = -1;     // No valid key pressed
 return k;
}

void update_adc_key(){
 int adc_key_in;
 char key_in;
 byte i;
 adc_key_in = analogRead(0);
 key_in = get_key(adc_key_in);
 for(i=0; i<NUM_KEYS; i++)
 {
   if(key_in==i)  //one key is pressed
   {
     if(button_count[i]<DEBOUNCE_MAX)
     {
       button_count[i]++;
       if(button_count[i]>DEBOUNCE_ON)
       {
         if(button_status[i] == 0)
         {
           button_flag[i] = 1;
           button_status[i] = 1; //button debounced to 'pressed' status
         }
       }
     }

   }
   else // no button pressed
   {
     if (button_count[i] >0)
     {  
       button_flag[i] = 0;
       button_count[i]--;
       if(button_count[i]<DEBOUNCE_OFF){
         button_status[i]=0;   //button debounced to 'released' status
       }
     }
   }
 }
}

// Timer2 interrupt routine -
// 1/(160000000/256/(256-6)) = 4ms interval
ISR(TIMER2_OVF_vect) {  
 TCNT2  = 6;
 update_adc_key();
}

double dewPoint(double t, double h)
{
       // (1) Saturation Vapor Pressure = ESGG(T)
       double RATIO = 373.15 / (273.15 + t);
       double RHS = -7.90298 * (RATIO - 1);
       RHS += 5.02808 * log10(RATIO);
       RHS += -1.3816e-7 * (pow(10, (11.344 * (1 - 1/RATIO ))) - 1) ;
       RHS += 8.1328e-3 * (pow(10, (-3.49149 * (RATIO - 1))) - 1) ;
       RHS += log10(1013.246);
       // factor -3 is to adjust units - Vapor Pressure SVP * humidity
       double VP = pow(10, RHS - 3) * h;
       // (2) DEWPOINT = F(Vapor Pressure)
       double T = log(VP/0.61078);   // temp var
       return (241.88 * T) / (17.558 - T);
}

// delta max = 0.6544 wrt dewPoint()
// 6.9 x faster than dewPoint()
// reference: http://en.wikipedia.org/wiki/Dew_point
double dewPointFast(double t, double h)
{
       double a = 17.271;
       double b = 237.7;
       double temp = (a * t) / (b + t) + log(h*0.01);
       double Td = (b * temp) / (a - temp);
       return Td;
}

void lecture(){
   float h = dht.readHumidity();
 float t = dht.readTemperature();
  pointrosee = dewPoint(t, h);
 char pointroseeBuf[8];
 sprintf(pointroseeBuf, "%d",pointrosee);
  temp = dht.readTemperature();
 char tempBuf[8];
 sprintf(tempBuf, "%d",temp);
  hum = dht.readHumidity();
 char humBuf[8];
 sprintf(humBuf, "%d",hum);
}

icare

Bonsoir,
@infobarquee. Si tu mets ton code entre des balises Code (#) plutôt que balises Quote, le tout sera plus lisible.
  ;)
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

infobarquee

oups, modifié ;)
faut que j'aille me coucher je crois  :smiley-mr-green:

Go Up