Diy Sky quality meter - Kalibrerad!

Här kan du skriva om dina teleskopbygge och andra byggprojekt (som observatorium mm) med beskrivningar, ritningar och bilder.
Corpze
Posts: 1012
Joined: 2012-03-01 04:00:53
spamtest: JA
Location: Arvika

Diy Sky quality meter - Kalibrerad!

Post by Corpze »

Nu är det dags igen :-)
Har intentionerna att även denna gången använda den högst kompetenta arduinon till att även mäta hur klar himmeln är, jag har kollat lite på unihedrons SQM och den använder en sensor som skickar ut en linjär signal. Är detta genomförbart? Kommer bli en del jobb med kalibrering dock.
Chippen som sitter i SQM' en idag heter TAOS TSL 237 men jag kan bara få tag i dessa i Sverige: https://www.elfa.se/elfa3~eu_en/elfa/in ... taos&cat=0 men de kanske fungerar lika bra?
TS N-AG10
Celestron C9.25" XLT
Meade 102mm APO
Astro Systeme Austria (ASA) DDM85
NEQ6 Pro Synscan
Atik 460 EX
SX Filterwheel LRGB Ha O3 S2

http://www.facebook.com/exophotograph" onclick="window.open(this.href);return false;
Corpze
Posts: 1012
Joined: 2012-03-01 04:00:53
spamtest: JA
Location: Arvika

Re: Diy Sky quality meter

Post by Corpze »

Nu är en TSL237 beställd från England och lite annat småkrafs, och jag kommer att börja skissa på koden... Inputen kommer att bli på pin5 som mäter pulser (frekvenser?)
Jag kommer att försöka klämma in även denna koden i SGL's fokuserarkod för att få en alltiettdator :-)
Det som jag känner att jag kommer att få svårt för är konverteringen från frekvens till Lux :-/

Men det skrivs också om en dutycycle på 50% , hur inverkar den?

Jag antar att jag kan utgå från denna koden för att mäta frekvenserna?
http://interface.khm.de/index.php/lab/e ... r-library/
TS N-AG10
Celestron C9.25" XLT
Meade 102mm APO
Astro Systeme Austria (ASA) DDM85
NEQ6 Pro Synscan
Atik 460 EX
SX Filterwheel LRGB Ha O3 S2

http://www.facebook.com/exophotograph" onclick="window.open(this.href);return false;
Corpze
Posts: 1012
Joined: 2012-03-01 04:00:53
spamtest: JA
Location: Arvika

Re: Diy Sky quality meter

Post by Corpze »

Tror jag fann en kod ja kan använda, inte riktigt samma sensor men den skicka ut frekvens iaf, kanske kan va bra att börja med

http://playground.arduino.cc/Main/TSL235R

Sen undrar jag om det gör nåt att strömmen är på konstant till sensorn, även när ja inte läser från den?

Kan ja ansluta sensorn via en kontakt eller kommer det störa signalen?
TS N-AG10
Celestron C9.25" XLT
Meade 102mm APO
Astro Systeme Austria (ASA) DDM85
NEQ6 Pro Synscan
Atik 460 EX
SX Filterwheel LRGB Ha O3 S2

http://www.facebook.com/exophotograph" onclick="window.open(this.href);return false;
Corpze
Posts: 1012
Joined: 2012-03-01 04:00:53
spamtest: JA
Location: Arvika

Re: Diy Sky quality meter

Post by Corpze »

Sådär, sensorn inkopplad och första koden inkörd... Den läser ut frekvenser som den skall men nu är det bara att försöka mäta upp min sensors "Zero Point" och gå därifrån i omvandlingen till mag/arcsecond2... hur skulle man kunna skriva för att ta tre mätningar för att få ett utjämnat värde? typ (freq1 + freq2 + freq3 /3)?

nu står delayen efter loopen på 1000ms, måste det vara just 1000 för att mäta frekvensen? (är just själva definitionen av frekvensen som jag läser ut hur många svängningar per sekund?)

Sedan när ja läser av serial.print så får jag det här:

úFrequency Counter
0 Pulses: 0; Freq: 0 Hz; Irradiance: 0 uW/cm2 = KHz
-2147483648 Mag/Arcsecond2 1 Pulses: 1736; Freq: 1886956 Hz; Irradiance: 1886 uW/cm2 = KHz
-3 Mag/Arcsecond2 2 Pulses: 10; Freq: 10869 Hz; Irradiance: 10 uW/cm2 = KHz
1 Mag/Arcsecond2 3 Pulses: 1; Freq: 1086 Hz; Irradiance: 1 uW/cm2 = KHz
4 Mag/Arcsecond2 4 Pulses: 1; Freq: 1086 Hz; Irradiance: 1 uW/cm2 = KHz
4 Mag/Arcsecond2 5 Pulses: 1; Freq: 1086 Hz; Irradiance: 1 uW/cm2 = KHz
4 Mag/Arcsecond2 6 Pulses: 1; Freq: 1086 Hz; Irradiance: 1 uW/cm2 = KHz
4 Mag/Arcsecond2 7 Pulses: 1; Freq: 1086 Hz; Irradiance: 1 uW/cm2 = KHz
4 Mag/Arcsecond2 8 Pulses: 1; Freq: 1086 Hz; Irradiance: 1 uW/cm2 = KHz
4 Mag/Arcsecond2 9 Pulses: 1; Freq: 1086 Hz; Irradiance: 1 uW/cm2 = KHz
4 Mag/Arcsecond2 10 Pulses: 1; Freq: 1086 Hz; Irradiance: 1 uW/cm2 = KHz
4 Mag/Arcsecond2 11 Pulses: 1; Freq: 1086 Hz; Irradiance: 1 uW/cm2 = KHz
4 Mag/Arcsecond2 12 Pulses: 1; Freq: 1086 Hz; Irradiance: 1 uW/cm2 = KHz
4 Mag/Arcsecond2 13 Pulses: 1; Freq: 1086 Hz; Irradiance: 1 uW/cm2 = KHz

Kan den inte gå lägre tro? Nu är inte min ZP kalibrarad alls, kan detta ha med saken att göra? Är formeln för omräkning fel? (magnitude = ZeroPoint - 2.5*log10(frequence);

Code: Select all

#include <FreqCounter.h>
#include <Math.h>


long irradiance;
long freq;
long pulses;
long magnitude;
const float ZP = 12; // "Zero Point" i just picked a random nr for now, not calibrated)
const float area = 0.0092;
int cnt;
int pinLed=13;
int buttonSQM = A2;
short period = 100; // 100 ms Gate Time

void setup() {
  pinMode(pinLed, OUTPUT);
  pinMode(buttonSQM, INPUT);
  digitalWrite(buttonSQM, HIGH);
  Serial.begin(115200);        // connect to the serial port
  Serial.println("Frequency Counter");
}


void loop() {
light();
Serial.print(cnt++);
Serial.print("  Pulses: ");
Serial.print(pulses);
Serial.print(";  Freq: ");
Serial.print(freq);
Serial.print(" Hz;  Irradiance: ");
Serial.print(irradiance);
Serial.println(" uW/cm2 = KHz");
Serial.print(magnitude);
Serial.print(" Mag/Arcsecond2 ");

delay(1000);
}  

void light(){
  if (buttonSQM = HIGH)
  digitalWrite(pinLed, HIGH);
  FreqCounter::f_comp=10;   // Cal Value / Calibrate with professional Freq Counter
  FreqCounter::start(period);  // 100 ms Gate Time
  while (FreqCounter::f_ready == 0)
  pulses=FreqCounter::f_freq;
  delay(20);
  digitalWrite(pinLed, LOW);
  freq = (pulses*1000)/(period*area);
  irradiance = (freq/1000);
  magnitude = ZP - 2.5*log10(freq);

  return ;
}
TS N-AG10
Celestron C9.25" XLT
Meade 102mm APO
Astro Systeme Austria (ASA) DDM85
NEQ6 Pro Synscan
Atik 460 EX
SX Filterwheel LRGB Ha O3 S2

http://www.facebook.com/exophotograph" onclick="window.open(this.href);return false;
Corpze
Posts: 1012
Joined: 2012-03-01 04:00:53
spamtest: JA
Location: Arvika

Re: Diy Sky quality meter

Post by Corpze »

Efter lite efterforskningar så är inte freqcounter rätt väg att gå, utan freqmeasure, dvs räkna pulser och beräkna Hz...

Hursomhelst så har jag gjort det, samt adderat en knapp för att "aktivera" mätningen... Nu vet jag inte om jag fått den kodsträngen helt rätt (inte provat än) men efter jag aktiverat mätningen så vill jag printa ut resultatet på min lcd/serial i 5 sek, sedan vill jag inte ha någon mer mätning, så mina frågor till någon mer kunnig är:

1. Har jag satt min "buttonSQM" - knapp rätt (alltså att min arduino inte kör den koden innan jag tryckt ner knappen en gång)?
2. använder jag en delay efter att all beräkning är gjord (om det går att använda delay samtidigt som biblioteket använder sig av interrupts?) för att visa resultatet av mätningen på min LCD/Serial i 5 sek?

3. Om jag nu riktar mätaren mot något lite ljusare så skriver den ut till SerialMonitorn ruskigt snabbt (kanske 5-10 rader / sek) vilket jag inte alls har ett behov av, kan man justera det så att den läser ut max 1-2 ggr per sekund?

MVH Daniel

Code: Select all

#include <LiquidCrystal.h>
#include <FreqMeasure.h>
#include <Math.h>

LiquidCrystal lcd (12, 11, 10, 9, 7, 6);
float Msqm;
const float A = 22;
int buttonSQM = A2;

void setup() {
   Serial.begin(19200);
   FreqMeasure.begin();
   pinMode(buttonSQM, INPUT);
   digitalWrite(buttonSQM, HIGH);
   lcd.begin(16,2);
}

double sum=0;
int count=0;

void loop() {
   if (buttonSQM = digitalRead(HIGH));{
     if (FreqMeasure.available()) {
      // average several reading together
     sum = sum + FreqMeasure.read();
     count = count + 1;
     if (count > 30) {
     double frequency = F_CPU / (sum / count);
     Serial.println(frequency);
     sum = 0;
     count = 0;

     Msqm = A - 2.5*log10(frequency); //Egen Kod
     Serial.print(Msqm);
     Serial.println(" Mag/Arcsecond2 ");
}
}
}
}
TS N-AG10
Celestron C9.25" XLT
Meade 102mm APO
Astro Systeme Austria (ASA) DDM85
NEQ6 Pro Synscan
Atik 460 EX
SX Filterwheel LRGB Ha O3 S2

http://www.facebook.com/exophotograph" onclick="window.open(this.href);return false;
Corpze
Posts: 1012
Joined: 2012-03-01 04:00:53
spamtest: JA
Location: Arvika

Re: Diy Sky quality meter

Post by Corpze »

Nu fungerar den klockrent... har lyckats implemeterat min SQM-kod tillsammans med SGL's fokuserarkod, LCD, temp och manuell fokuskontroll

Här är koden, slänger kanske ut en youtubefilm på hur allt lirar när jag har mer tid för det.

Code: Select all

#include <MsTimer2.h>
#include <DHT.h>
#include <LiquidCrystal.h>
#include <SPI.h>
#include <FreqMeasure.h>
#include <Math.h>



LiquidCrystal lcd (12, 11, 10, 9, 7, 6);

//START OF FOCUS CONTROL INITIALISE
// include the library code:
#include <EEPROM.h>
#include <eepromRW.h>

#define MAX_COMMAND_LEN             (5)
#define MAX_PARAMETER_LEN           (6)
#define COMMAND_TABLE_SIZE          (11)
#define TO_UPPER(x) (((x >= 'a') && (x <= 'z')) ? ((x) - ('a' - 'A')) : (x))

#define DHTPIN A3
#define DHTTYPE DHT22

// initialize the library with the numbers of the interface pins
int dirPin = 2; // Easy Driver Direction Output Pin
int stepperPin = 3; // EasyDriver Stepper Step Output Pin
int powerPin = 4; //Sets the output used to power the Driver board
unsigned long powerMillis = 0; // used to remember when EasyDriver power was enabled
int motorSteps =1600; //number if steps for the motor to turn 1 revolution

// MY OWN BUTTONCODE

int buttonIN = A0;
int buttonOUT = A1;
int val = 0;

// END OF MY OWN BUTTONCODE

// MY OWN DHT TO LCD-CODE

DHT dht(DHTPIN, DHTTYPE);

// END OF MY OWN DHT TO LCD-CODE

// MY OWN STEPS TO LCD-CODE

volatile long manualNoOfSteps;

// END OF MY OWN STEPS TO LCD-CODE

// MY OWN SQM-CODE

float Msqm;
const float A = 22.0;
int buttonSQM = A2;
int reading = 0;
int percentage = 0;

// END OF MY OWN SQM-CODE

volatile long NoOfSteps = 1000; //required number of steps to make
volatile long Position = 0; //used to keep track of the current motorposition
volatile long MaxStep = 200000; //define maximum no. of steps, max travel
volatile int SPEED = 200;
volatile byte MotorType = 0; // Motortypes, default is 0, Stepper motor, 1=Servo, 2=DC motor                           
volatile int BoardType = 0; // Boardtypes, default is 0, EasyDriver, 1=L293 chip, 2=LadyAda AFmotor board                           

boolean Direction = true;//True is one way false is other.Change to false if motor is moving in the wrong direction
boolean IsMoving = false;
boolean Absolute = true;
volatile long MaxIncrement=16384;//not yet used
//END OF FOCUS CONTROL INITIALISE

//Serial comms setup
char incomingByte = 0; // serial in data byte
byte serialValue = 0;
boolean usingSerial = true; // set to false to have the buttons control everything
char gCommandBuffer[MAX_COMMAND_LEN + 1];
char gParamBuffer[MAX_PARAMETER_LEN + 1];
long gParamValue;
volatile boolean UPDATE = true;

struct config_t //Memory Structure for Parking, Unparking the Focuser and other config settings 
{
    long parkposition;
    boolean parked;
    boolean stepperdirection;
    long controlboardtype;
} configuration;


typedef struct {
  char const    *name;
  void          (*function)(void);
} 
command_t;

//Set up a command table. when the command "IN" is sent from the PC and this table points it to the subroutine to run
command_t const gCommandTable[COMMAND_TABLE_SIZE] = {
  {
    "IN1",     FocusINFun,  }
  ,
  {
    "OUT",    FocusOUTFun,   }
  ,
  {
    "STP",  FocusSTEPSFun,   }
  ,
  {
    "SPD",  FocusSPEEDFun,   }
  ,
  {
    "LMT",  FocusSLimitFun,   }
  ,
  {
    "POS",    FocusSPositionFun,   }
  ,  
  {
    "MDE",   FocusSModeFun,   }
  ,
  {
    "TYP",   FocusSTypeFun,   }
  ,  
  {
    "PRK",   ParkFocuserFun,   }
  ,  
  {
    "BRD",   FocusBoardTypeFun,   }
  ,  
  {
    NULL,      NULL   }
};

//Serial Comms setup end

void setup() {

  EEPROM_readAnything(0, configuration); //PARKING:- Read the Position and Parked info
    if (configuration.parked == true) { //If the Focuser was Parked then load the Position information
    
     Position = configuration.parkposition; //Load the Position information
     Direction = configuration.stepperdirection;
     BoardType = configuration.controlboardtype;
  }

  pinMode(dirPin, OUTPUT); //Initialise Easydriver output
  pinMode(stepperPin, OUTPUT); //Initialise easy driver output
  //START OF FOCUS CONTROL SETUP
   //END OF FOCUS CONTROL SETUP
  Serial.begin(19200);// start the serial
  NoOfSteps=1000;
  pinMode(13,OUTPUT); 
  pinMode(powerPin,OUTPUT); //Easydriver Sleep mode or power off
  digitalWrite(powerPin, LOW); //Easydriver Pwer off (Low = powered down)
  
  // MY OWN BUTTONCODE
  pinMode(dirPin, OUTPUT);
  pinMode(stepperPin, OUTPUT);
  pinMode(buttonIN, INPUT);
  digitalWrite(buttonIN, HIGH);
  pinMode(buttonOUT, INPUT);
  digitalWrite(buttonOUT, HIGH);
  // END OF MY OWN BUTTONCODE
  
  // MY OWN DHT TO LCD-CODE
  lcd.begin(16,2);
  dht.begin();
  // END OF MY OWN DHT TO LCD-CODE
  
  // MY OWN SQM-CODE
  
  pinMode(buttonSQM, INPUT_PULLUP);
  digitalWrite(buttonSQM, HIGH);
  
  // END OF MY OWN SQM-CODE
 
  
  
  
}

// MY OWN SQM-CODE

double sum=0;
int count=0;

// END OF MY OWN SQM-CODE

void printStep(){
lcd.setCursor(6,0);
char s[7];
sprintf(s, "%7ld", manualNoOfSteps);
lcd.print(s);

MsTimer2::set(200, printStep);
MsTimer2::start();
}
void loop() {

 
  int bCommandReady = false;
  
  //FocuserControl Power off command
  if (millis() > (powerMillis + 20000)) // check if power has been on for more than 20 seconds
  {
      digitalWrite(powerPin, LOW); // if yes, then disable power
  }
  
  //If There is information in the Serial buffer read it in and start the Build command subroutine
  if (usingSerial && Serial.available() >= 1) {
    // read the incoming byte:
    incomingByte = Serial.read();
    delay(5);
    if (incomingByte == '#') {
    // Build a new command. //
    bCommandReady = cliBuildCommand(incomingByte);
    }
  }
  else
  {
    incomingByte=0;
    //Serial.flush();
  }

  //If there is a command in the buffer then run the process command subroutine
  if (bCommandReady == true) {
    bCommandReady = false; // reset the command ready flag
    cliProcessCommand(); // run the command
  }
 if ((Position != configuration.parkposition)) {
  configuration.parked = 0;
  EEPROM_writeAnything(0, configuration);
 }
  if (UPDATE){
    UPDATE=false;
    SerialDATAFun();  // Used to send the current state of the focuser to the PC over serial comms
  }
  
//MY OWN BUTTONCODE

//IN

lcd.setCursor(0,0);
        lcd.print("Steps:");

delayMicroseconds(200);
val = digitalRead(buttonIN);
  if (val == LOW)
  {
    digitalWrite(powerPin, HIGH);
    digitalWrite(dirPin, HIGH);
    MsTimer2::set(500, printStep);
    MsTimer2::start();
    while (val == LOW) {
      digitalWrite(stepperPin, HIGH);
      delayMicroseconds(200);
      digitalWrite(stepperPin, LOW);
      delayMicroseconds(200);
      manualNoOfSteps  = manualNoOfSteps + 1;
      
      val = digitalRead(buttonIN);
    }
    MsTimer2::stop();
    
  }

  
//OUT

delayMicroseconds(200);
  val = digitalRead(buttonOUT);
  if (val == LOW)
  {
    digitalWrite(powerPin, HIGH);
    digitalWrite(dirPin, LOW);
    MsTimer2::set(500, printStep);
    MsTimer2::start();
    while (val == LOW) {
      digitalWrite(stepperPin, HIGH);
      delayMicroseconds(200);
      digitalWrite(stepperPin, LOW);
      delayMicroseconds(200);
      manualNoOfSteps = manualNoOfSteps - 1;
      
      val = digitalRead(buttonOUT);
    }
    MsTimer2::stop();
   
  }
  
 // END OF MY OWN BUTTONCODE
 
 // MY OWN DHT TO LCD-CODE
 
 // Reading temperature or humidity takes about 250 milliseconds!
 // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
 float h = dht.readHumidity();
 float t = dht.readTemperature();

 // check if returns are valid, if they are NaN (not a number) then something went wrong!
 if (isnan(t) || isnan(h)) {
 lcd.setCursor(1,1);
 lcd.println("Failed to read from DHT");
 } else {
  lcd.setCursor(9,1);
  lcd.print(h);
  lcd.print(" %");
  lcd.setCursor(0,1);
  lcd.print(t);
  lcd.print((char)223);
  lcd.print("C");
  }

 // END OF MY OWN DHT TO LCD-CODE
 
 
 // MY OWN SQM-CODE
 
val = digitalRead(buttonSQM);
   if (val == LOW) {
      reading = 1;
      lcd.clear();
      FreqMeasure.begin();      
      while(reading) {
                 
         if (FreqMeasure.available()) {
            // average several reading together
            sum = sum + FreqMeasure.read();
            count +=1;
            
            percentage = count/31.0*100.0;
            lcd.setCursor(0,0);
            lcd.print("Reading");
            lcd.setCursor(8,0);
            lcd.print(percentage);
            lcd.setCursor(11,0);
            lcd.print("%");                 
                             
            if (count > 30) {
               double frequency = F_CPU / (sum / count);
               sum = 0;
               count = 0;
               
               Msqm = A - 2.5*log10(frequency); //Frequency to magnitudes/arcSecond2 formula
                
               lcd.clear();
               lcd.setCursor(0,0);
               lcd.println("Mag/As2: ");
               lcd.setCursor(9,0);
               lcd.print(Msqm);
               delay(5000);
               lcd.clear();
               reading = 0; 
               FreqMeasure.end();
            }
         }
      }
   }
}
 
 // END OF MY OWN SQM-CODE



//***************************************************
//*****Start of User defined Functions **************
//***************************************************

//START OF FOCUS CONTROL FUNCTIONS
void EasyDriverStep(boolean dir,long steps){
  digitalWrite(powerPin, HIGH); // enable power to the EasyDriver
  powerMillis = millis(); // remember when power was switched on
  delayMicroseconds(10); // wait a bit after switching on power
  digitalWrite(dirPin,dir);
  delay(100);
  for(int i=0;i<steps;i++){
    digitalWrite(stepperPin, HIGH);
    delayMicroseconds(SPEED);
    digitalWrite(stepperPin, LOW);
    delayMicroseconds(SPEED);
  }
}

void ParkFocuserFun (void) {//Park the focuser by setting the Park bit to 1 and the current Focuser Position in Configuration

 if (configuration.parked == false){
 configuration.parkposition = Position;
 configuration.stepperdirection = Direction;
 configuration.parked = true;
 configuration.controlboardtype = BoardType;
 
 EEPROM_writeAnything(0, configuration);
 }
  UPDATE=true; //Update even if the focuser was already parked
}

void FocusINFun (void) {//Move the Stepper IN.
  long Steps = 0;

  if (Absolute == false) {  //If not Absolute move the number of steps
    if ((Position-NoOfSteps)>=0) {
    switch (BoardType) {
    case 0:
      EasyDriverStep(Direction,NoOfSteps);
      break;
      default: 
      // if nothing else matches, do the default
      // default is optional
      break;
      }
       Position=Position-NoOfSteps;
      }
  }
  else if (NoOfSteps < MaxStep) //Absolute :- work out the number of steps to take based on current position
  {
    if (NoOfSteps<Position){
    
       Steps=(Position-NoOfSteps);
       switch (BoardType) {
        case 0:
         EasyDriverStep(Direction,Steps);
        break;
        default: 
      // if nothing else matches, do the default
      // default is optional
      break;
      }
     Position=NoOfSteps;
    }
    else
    {
    Steps=(NoOfSteps-Position);
    switch (BoardType) {
        case 0:
         EasyDriverStep(!Direction,Steps);
        break;
        default:
        break; 
      }
    Position=NoOfSteps;  
    }
  }
  // set the update flag so that the new position is displayed
  IsMoving=true;
  UPDATE=true;
}

void FocusOUTFun (void) {//Move the Stepper OUT.
 long Steps = 0;

  if (Absolute == false) {  //If not Absolute move the number of steps
    if ((Position+NoOfSteps)<=MaxStep) {
       switch (BoardType) {
        case 0:
         EasyDriverStep(!Direction,NoOfSteps);
        break;
        default: 
      // if nothing else matches, do the default
      // default is optional
       break;
      }
      Position=Position+NoOfSteps;
    }
  }
  else if (NoOfSteps < MaxStep) //Absolute :- work out the number of steps to take based on current position
  {
    if (NoOfSteps>Position){
    
    Steps=(NoOfSteps-Position);
    switch (BoardType) {
        case 0:
         EasyDriverStep(!Direction,Steps);
        break;
        default: 
      // if nothing else matches, do the default
      // default is optional
       break;
      }
    Position=NoOfSteps;
    }
    else
    {
    Steps=(Position-NoOfSteps);
    switch (BoardType) {
        case 0:
         EasyDriverStep(Direction,Steps);
        break;
        default: 
      // if nothing else matches, do the default
      // default is optional
       break;
      }
    Position=NoOfSteps;  
    }
  }
  // set the update flag so that the new position is displayed
  IsMoving=true;
  UPDATE=true;
}

void FocusSTEPSFun (void) {//Set the number of Steps.
  NoOfSteps = gParamValue;
  // set the update flag so that the new position is displayed
  UPDATE=true;
}

// function to set the RPM of the stepper motor
// user sends :speed:500:
void FocusSPEEDFun (void) {
  SPEED = gParamValue;
  UPDATE=true;
}

// Set max limit for focus travel, for absolute positioning focusers
void FocusSLimitFun (void) {
  MaxStep = gParamValue;
  UPDATE=true;
}

// set current focuser position, used for calibrating absolute positioning focusers
void FocusSPositionFun (void) {
  Position = gParamValue;
  UPDATE=true;
}

// set the focuser mode to relative 0 or absolute positioning 1
void FocusSModeFun (void) {
  switch (gParamValue){
  case 0:
    Absolute=false;
    //Serial.println("Relative Mode"); // debug only
    break;
  case 1:
    Absolute=true;
    //Serial.println("Absolute Mode"); // debug only
    break;
  default:
    //Serial.println("0 or 1 for relative or absolute, try again"); // debug only
    break;  
  }
  UPDATE=true;
}
// to add different motor types, stepper, servo or DC
void FocusSTypeFun(void){
  MotorType=gParamValue;
  UPDATE=true;
}

// to add different motor types, stepper, servo or DC
void FocusBoardTypeFun(void){
  BoardType=gParamValue;
  UPDATE=true;
}
//END OF FOCUS CONTROL FUNCTIONS

//Start of serial control functions

void SerialDATAFun (void) {//Update All information over comms if there has been any change in the state of the focuser
   Serial.print("#POS:");  
  Serial.print(Position);
  Serial.println(";");
  Serial.print("#STP:" );
  Serial.print(NoOfSteps);
  Serial.println(";");
  Serial.print("#MDE:");
  if (Absolute){
  Serial.print("1");
  }
  else{  
  Serial.print("0");
  }
  Serial.println(";");
  Serial.print("#LMT:");
  Serial.print(MaxStep);
  Serial.println(";");
   Serial.print("#SPD:");
 if (SPEED==0){
  Serial.print(char(SPEED));
  }
  else{  
  Serial.print(SPEED);
  }
  Serial.println(";");
  if (IsMoving==true) {
    Serial.print("#MOV:");
    Serial.print("1");
    Serial.println(";");
    IsMoving=false;
  }
  Serial.print("#BRD:0");  
  Serial.print(BoardType);
  Serial.println(";");
  Serial.print("#PRK:");  
  if (configuration.parked == 1) Serial.print("01"); else Serial.print("00");
  Serial.println(";");
}


//Process Command. This searches the command table to see if the command exits if it does then the required subroutine is run
void cliProcessCommand(void)
{
  int bCommandFound = false;
  int idx;

  /* Convert the parameter to an integer value. 
   * If the parameter is emplty, gParamValue becomes 0. */
  gParamValue = strtol(gParamBuffer, NULL, 0);

  /* Search for the command in the command table until it is found or
   * the end of the table is reached. If the command is found, break
   * out of the loop. */
  for (idx = 0; gCommandTable[idx].name != NULL; idx++) {
    if (strcmp(gCommandTable[idx].name, gCommandBuffer) == 0) {
      bCommandFound = true;
      break;
    }
  }

  /* If the command was found, call the command function. Otherwise,
   * output an error message. */
  if (bCommandFound == true) {
    (*gCommandTable[idx].function)();
  }
}


//When data is in the Serial buffer this subroutine is run and the information put into a command buffer.
// The character : is used to define the end of a Command string and the start of the parameter string
// The character ; is used to define the end of the Parameter string
int cliBuildCommand(char nextChar) {
  static uint8_t idx = 0; //index for command buffer
  static uint8_t idx2 = 0; //index for parameter buffer
  int loopchk = 0;

  nextChar = Serial.read();
  do
  {

    gCommandBuffer[idx] = TO_UPPER(nextChar);
    idx++;
    nextChar = Serial.read();
    loopchk=loopchk+1;
  } 
  while ((nextChar != ':') && (loopchk < 100));

  loopchk=0;

  nextChar = Serial.read();

  do
  {

    gParamBuffer[idx2] = nextChar;
    idx2++;
    nextChar = Serial.read();
  } 
  while ((nextChar != ';')&& (idx2 < 100));



  gCommandBuffer[idx] = '\0';
  gParamBuffer[idx2] = '\0';
  idx = 0;
  idx2 = 0;

  return true;
}

//END of serial control functions


TS N-AG10
Celestron C9.25" XLT
Meade 102mm APO
Astro Systeme Austria (ASA) DDM85
NEQ6 Pro Synscan
Atik 460 EX
SX Filterwheel LRGB Ha O3 S2

http://www.facebook.com/exophotograph" onclick="window.open(this.href);return false;
User avatar
akjalam2
Posts: 184
Joined: 2012-01-07 17:37:59
spamtest: JA

Re: Diy Sky quality meter (färdigställd, ej kalibrerad)

Post by akjalam2 »

Kul projekt.

Är tanken en ljussensor riktad via lins mot himlen eller tar den mer ett allmänt sample ?
Corpze
Posts: 1012
Joined: 2012-03-01 04:00:53
spamtest: JA
Location: Arvika

Re: Diy Sky quality meter (färdigställd, ej kalibrerad)

Post by Corpze »

Den är bygd med samma sensor, lins och uv/ir-cut filter som den "riktiga" SQM-mätaren från unihedron och allt är klart förutom kalibreringen... Jag vet inte riktigt hur jag skall göra den heller :\ A-B jämförelse vore det bästa dock... Idéer? /-)
TS N-AG10
Celestron C9.25" XLT
Meade 102mm APO
Astro Systeme Austria (ASA) DDM85
NEQ6 Pro Synscan
Atik 460 EX
SX Filterwheel LRGB Ha O3 S2

http://www.facebook.com/exophotograph" onclick="window.open(this.href);return false;
Corpze
Posts: 1012
Joined: 2012-03-01 04:00:53
spamtest: JA
Location: Arvika

Re: Diy Sky quality meter (färdigställd, ej kalibrerad)

Post by Corpze »

Här är ett litet videoklipp på hur allt funktionerar hittils :) Lite ur fokus dock :P

https://www.youtube.com/watch?v=JTCwIEWBquQ
TS N-AG10
Celestron C9.25" XLT
Meade 102mm APO
Astro Systeme Austria (ASA) DDM85
NEQ6 Pro Synscan
Atik 460 EX
SX Filterwheel LRGB Ha O3 S2

http://www.facebook.com/exophotograph" onclick="window.open(this.href);return false;
User avatar
Robert
Site Admin
Posts: 2983
Joined: 2005-12-06 11:07:12
spamtest: JA
Location: Alingsås
Contact:

Re: Diy Sky quality meter (färdigställd, ej kalibrerad)

Post by Robert »

Ser ut som ett roligt projekt.

Har funderat på bygga en arduinofokuserare som sitter på min Feathertouch med om jag får tid över någon gång.
Corpze
Posts: 1012
Joined: 2012-03-01 04:00:53
spamtest: JA
Location: Arvika

Re: Diy Sky quality meter (färdigställd, ej kalibrerad)

Post by Corpze »

Klart du ska Robert! Det är kul att greja med arduinos som sagt var! Så länge man inte ska in och ändra i orginalkoden så tar det inte så lång tid heller!

Nu är iaf min egna SQM-mätare även kalibrerad!

Jag använde mig av den nyligen anlända appen "Dark Sky Pro" för 32kr i Appstore (endast iphone 4S och 5 tyvärr pga kalibrering). Tydligen ska den appen ha en felmarginal på 0.1 mag/AS2 mot Unihedrons SQM-mätare.

Jag gjorde helt enkelt så att jag tog fem mätningar och tog medelvärdet av dem och började mäta med min arduino. Allt eftersom jag ändrade på ( const float A = 22.0; ) mot 19 så fick jag bättre och bättre värden för att landa exakt på 19, då jag kunde mäta med en noggrannhet på 0.02 ungefär.

Jag är mer än nöjd med den utgången.

Såhär ser den ut:
bild.jpg
bild.jpg (152.15 KiB) Viewed 7002 times
MVH Daniel
TS N-AG10
Celestron C9.25" XLT
Meade 102mm APO
Astro Systeme Austria (ASA) DDM85
NEQ6 Pro Synscan
Atik 460 EX
SX Filterwheel LRGB Ha O3 S2

http://www.facebook.com/exophotograph" onclick="window.open(this.href);return false;
Starsoft
Posts: 1501
Joined: 2007-09-20 14:21:00
Location: Gävle
Contact:

Re: Diy Sky quality meter - Kalibrerad!

Post by Starsoft »

Hej

Det där ser riktigt snyggt ut.

Displayen på handkontrollen till min EQ6 blir svår att läsa redan vid minusgrader och lägger av helt vid ca -10 grader, så jag undrar om du har någon erfarenhet av hur den där displayen/elektroniken uppträder när det blir kallt?

Anders
Observatorium v2.0: http://www.hemlin.se/astroweb
Corpze
Posts: 1012
Joined: 2012-03-01 04:00:53
spamtest: JA
Location: Arvika

Re: Diy Sky quality meter - Kalibrerad!

Post by Corpze »

Tackar... den blir tyvärr seg :( är ju en LCD, borde döpas om till ALCD (Almost liquid chrystal display)
TS N-AG10
Celestron C9.25" XLT
Meade 102mm APO
Astro Systeme Austria (ASA) DDM85
NEQ6 Pro Synscan
Atik 460 EX
SX Filterwheel LRGB Ha O3 S2

http://www.facebook.com/exophotograph" onclick="window.open(this.href);return false;
timokarhula
Posts: 1786
Joined: 2006-11-09 07:56:28

Re: Diy Sky quality meter - Kalibrerad!

Post by timokarhula »

Det kallaste då jag mätt himlens mörker med min Unihedrons SQM-L var nog på Värmland Star Party den 5-6 mars 2010. På kvällen var det -15º enligt mätaren själv och jag märkte inte av någon större slöhet i displayen. Som bäst visade apparaten 21.41 magnituder per kvadratbågsekund.

Däremot blir LCD-displayen väldigt seg på min Meade ETX-125ECs Autostar när det är minusgrader. Displayen blir otydlig och bläddringen långsam.

/Timo K
Corpze
Posts: 1012
Joined: 2012-03-01 04:00:53
spamtest: JA
Location: Arvika

Re: Diy Sky quality meter - Kalibrerad!

Post by Corpze »

Displayen på den riktiga SQM-mätaren är en segment-display va? tror de tål minusgrader bättre.. Fördelen med om jag har fokuserarfunktionen aktiv är att drivkretsen till motorn blir så varm att det värmer upp lådan lite så displayen inte blir så seg!
TS N-AG10
Celestron C9.25" XLT
Meade 102mm APO
Astro Systeme Austria (ASA) DDM85
NEQ6 Pro Synscan
Atik 460 EX
SX Filterwheel LRGB Ha O3 S2

http://www.facebook.com/exophotograph" onclick="window.open(this.href);return false;