Pages: 1 [2]   Go Down
Author Topic: point de rosée pour astronomie  (Read 2567 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Faraday Member
**
Karma: 34
Posts: 5077
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Edison Member
*
Karma: 17
Posts: 1967
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Faraday Member
**
Karma: 34
Posts: 5077
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
 
Logged

Offline Offline
Edison Member
*
Karma: 17
Posts: 1967
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-sad
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.
Logged

Offline Offline
Edison Member
*
Karma: 17
Posts: 1967
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Edison Member
*
Karma: 17
Posts: 1967
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Edison Member
*
Karma: 17
Posts: 1967
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
#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);
}
« Last Edit: November 17, 2013, 06:10:42 pm by infobarquee » Logged

Moselle (FR)
Offline Offline
Edison Member
*
Karma: 16
Posts: 1250
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

Offline Offline
Edison Member
*
Karma: 17
Posts: 1967
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

oups, modifié smiley-wink
faut que j'aille me coucher je crois  smiley-mr-green
Logged

Pages: 1 [2]   Go Up
Jump to: