point de rosée pour astronomie

infobarquee:
bonjour tout le monde,
...
si le point de rosée est égal à la temp, on met en route la résistance chauffante et le ventilo.

j'ai encore quelques trucs a paufiner et optimiser le code

Bonsoir
Tu aurais du mettre ton post dans la section générale 8)

dans ce genre de problème il peut y avoir plusieurs méthodes d'approche de détections et d'actions

Il n'est pas toujours necessaire de "chauffer" pour evacuer, et meme en restant sur du DIY

  • La méthode psychométrique associée à l'effet peltier , semble donner aussi des bons résultats

icare:
Bonsoir,
Sympa le projet.
Tu vas pouvoir vérifier les théories de Jean Meeus par tout temps.
:slight_smile:

hoooo, pas si vite, j'ai pas un mauvais matos, mais de là a lui arriver au petit doigt de pied :slight_smile:

si vous voulez vous amuser ou avoir mal au crane, un pote de longue date a fait ce site
http://www.fractaledelunivers.net/
il a même une constante qui porte son nom maintenant dans le domaine, c'est tout dire, et fou d'astro par dessus le marcher.

Re,
Site intéressant et à approfondir.
Pour ma part, j'ai bien l'astronomie mais pas en terme d'observation et en terme de calcul de position des astres d'où mes références à Jean Meeus.

Tu aurais du mettre ton post dans la section générale smiley-cool

c'est une réalisation en cours, donc je pense que la section est la mieux adaptées, puisqu'elle va finaliser le projet.

Il n'est pas toujours necessaire de "chauffer" pour evacuer, et meme en restant sur du DIY

  • La méthode psychométrique associée à l'effet peltier , semble donner aussi des bons résultats

le but n'est pas d'évacuer, mais d'éviter le point de rosée dans le tube, sur les miroirs, etc...
donc on peut chauffer et ventiler pour augmenter juste de 0.5-0.2C et encore, pour ne pas l'atteindre, ce fameux point.
trop chauffer, peut être néfaste pour différentes raisons :
déformation des miroirs ou de la collimation
effet parasite pour les prises de vue photo ou l'observation (perturbation comme quand il fait chaud au dessus d'une route)
consommation de la batterie aussi qui sert pour la monture (azimutale pour ma part avec raquette cablée sur un pc)

pour la résistance, plusieurs systèmes peuvent être utilisés suivant le diamètre de la bête, en générale, on compte 1w par cm :
résistances en série (8-10 R de 10-20ohms)
cable chauffant (comme dans les couveuses, ha ca me dit quelque chose :slight_smile: )
d'autres modèles sur le marcher, mais à prix de ouf

certains utilisent aussi un sèche cheveux pour aller plus vite, mais pas la meilleure solution.

infobarquee:
...
pour la résistance, plusieurs systèmes peuvent être utilisés suivant le diamètre de la bête, en générale, on compte 1w par cm :
résistances en série (8-10 R de 10-20ohms)
...

Alors si tu veux jouer seulement avec des résistances pour valider, je dois avoir des bonnes candidates :grin: ... reformées

à suivre à compter de lundi

arf :slight_smile:
si je ne m'abuse, 10w correspondent à +0.31C et des cahuettes par minute

de plus j'ai mis 2 param en compte.
le point de rosée (temp = PR), mais aussi l'humidité (h>90%).
au moins je suis certain (dans la théorie évidemment), de palier à un défaut d'une sonde de temp.

de plus, je vais coupler une autre chauferette sur l'occulaire, car rien que de regarder peut aussi provoquer une condensation sur la lentille.
quand on joue sur le ciel profond (même si mon bébé est limite pour ca), la moindre perturbation et c'est la cata.

demain, j'attaque le pare buée et je mettrais des photos

Artouste:

infobarquee:
...
pour la résistance, plusieurs systèmes peuvent être utilisés suivant le diamètre de la bête, en générale, on compte 1w par cm :
résistances en série (8-10 R de 10-20ohms)
...

Alors si tu veux jouer seulement avec des résistances pour valider, je dois avoir des bonnes candidates :grin: ... reformées

à suivre à compter de lundi

je savais bien que je devais en avoir une ou deux dans mes tiroirs perso :grin:
ce genre de resistance etait utilisée pour stabiliser en T° des enceintes base de temps.
Comme ce sont des tubes , la convection forcée par ventilateur était facile.
Il faudrait que je retrouve les docs , mais de memoire il y avait de la gestion serie //.

oui on peut mettre des R en série.
par contre ta photo, ben ca ira pas, cat il faut que ca fasse le tour du tube pour faire homogène, sans pour autant "boucher la vue".
j'ai ce genre de chose dans mon bordelum

50w en 220v pour 50cm, si mes calculs sont bons et si c'est possible, je dois sortir dans les 5-8w en 12v
donc une élévation de la temp d'environ 0.25C/mn largement de quoi empêcher le point de rosée.

infobarquee:
oui on peut mettre des R en série.
par contre ta photo, ben ca ira pas, cat il faut que ca fasse le tour du tube pour faire homogène, sans pour autant "boucher la vue".
j'ai ce genre de chose dans mon bordelum

50w en 220v pour 50cm, si mes calculs sont bons et si c'est possible, je dois sortir dans les 5-8w en 12v
donc une élévation de la temp d'environ 0.25C/mn largement de quoi empêcher le point de rosée.

Comme c'est surement du résistif quasi pur , la courbe ne sera pas linéaire , mais ça peut etre suffisant, de toutes façon le test est facile à faire

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

infobarquee:
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) :grin:
http://cjoint.com/13oc/CJCqlm7ZDqA_img_0001a.jpg
le calcul de resistance est simple à faire les parametres dimensionnels etant connu
l L epaisseur Cu

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.

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.

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

Artouste:
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 :frowning:
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.

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 :slight_smile:
faudra juste ne pas faire de photo pendant que ca tourne, car les vibrations vont faire tache.

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

#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); 
}

Bonsoir,
@infobarquee. Si tu mets ton code entre des balises Code (#) plutôt que balises Quote, le tout sera plus lisible.
:wink:

oups, modifié :wink:
faut que j'aille me coucher je crois :grin: