/* version 0.54 of 19 March 2015 Program for displaying AZ and EL on LCD (16 x 2) screen using Arduino input 9600 bits/s frames with byte layout: del el el az az 13 (hex) del(imiter) is: C0 (hex) for frames with only az information C1 for for frames with only el information C2 for for frames with az and el information input is to Arduino usart connections of LCD display and offsetbuttons: see program comments are welcome. ON4CDU (at) uba.be */ #include // include the library code: #include const int offazup = 3; // pin for change az offset const int offazdn = 4; // pin for change az offset const int offelup = 5; // pin for change el offset const int offeldn = 6; // pin for change el offset // button variables int stateoffazup = 1; // buttonstate az offset int stateoffazdn = 1; // buttonstate int stateoffelup = 1; // buttonstate el offset int stateoffeldn = 1; // buttonstate // frame variables int del = 0; // delimiter character int frameend = 0; // end of frame character int ello = 0; // elevation low byte int elhi = 0; // elevation high byte int azlo = 0; // azimuth low byte int azhi = 0; // azimuth high byte // calculation and display variables float el = 0; // elevation value float elone = 0; // used for smoothing float eltwo = 0; // used for smoothing float eld = 0; // elevation display value float az = 0; // needed for transformation az to float value float azg = 0; // az in degrees float correl = 0.986; //correction factor for el float yeasufactor = 1.764; // correction for yeasu gear float offsetaz = 0.0; // offset for azimuth; 49.0 used by on4cdu float offsetel = 0; // offset for elevation // EEPROM addresses #define EEPROM_ADDR_STATUS 0 #define EEPROM_ADDR_OFFSET_AZ 1 #define EEPROM_ADDR_OFFSET_EL 5 // general variables needed in program int d = 0; // timer delay LiquidCrystal lcd(12, 11, 10, 9, 8, 7);// initialize the library with the numbers of the interface pins void setup() { lcd.begin(16,2); // set up the LCD's number of columns and rows Serial.begin(9600); // opens serial port, sets data rate to 9600 bps pinMode(offazup, INPUT_PULLUP); // set pin to input and enable pullup resistor pinMode(offazdn, INPUT_PULLUP); pinMode(offelup, INPUT_PULLUP); pinMode(offeldn, INPUT_PULLUP); if (1 == EEPROM.read (EEPROM_ADDR_STATUS)) { char* p_mem = (char*)(&offsetaz); p_mem [0] = EEPROM.read (EEPROM_ADDR_OFFSET_AZ); p_mem [1] = EEPROM.read (EEPROM_ADDR_OFFSET_AZ+1); p_mem [2] = EEPROM.read (EEPROM_ADDR_OFFSET_AZ+2); p_mem [3] = EEPROM.read (EEPROM_ADDR_OFFSET_AZ+3); p_mem = (char*)(&offsetel); p_mem [0] = EEPROM.read (EEPROM_ADDR_OFFSET_EL); p_mem [1] = EEPROM.read (EEPROM_ADDR_OFFSET_EL+1); p_mem [2] = EEPROM.read (EEPROM_ADDR_OFFSET_EL+2); p_mem [3] = EEPROM.read (EEPROM_ADDR_OFFSET_EL+3); } } // Main program void loop() { readstatebuttons();// changing offset? d = 300; while (stateoffazup == LOW || stateoffazdn == LOW || stateoffelup == LOW || stateoffeldn == LOW){offsetcorrection();} if (Serial.available() > 15) { del = Serial.read(); while (del !=192 && del != 193 && del != 194 ) {del = Serial.read();}; // search for 192, 193 or 194 hex in data if (del == 192) // header az frame { del = 0; readframe(); if (frameend == 19 && ello == 0 && elhi == 0) // check frame { transformaz(); displayaz(); } } if (del == 193) // header of el frame { del = 0; readframe(); if (frameend == 19 && azlo == 0 && azhi == 0) //check frame { transformel(); displayel(); } } if (del == 194) // header of az/el frame { del = 0; readframe(); if (frameend == 19) //end of frame character { transformaz(); displayaz(); transformel(); displayel(); } } } } void readframe() // read frame { elhi = Serial.read(); ello = Serial.read(); azhi = Serial.read(); azlo = Serial.read(); frameend = Serial.read(); } void transformaz() // transform azimuth info to degrees { az =(azhi * 256 + azlo); // az information in decimal format azg = (az *360 * yeasufactor)/4096; // transformation to degrees } void transformel() // transform elevation info to degrees { elone = elhi * 256 + ello; if (elone < 0) {elone = elone + 29542;} // correction for below zero value info from chip el = (elone + eltwo)/2; // smoothing el = el * correl; el = (el/100); eltwo = elone; } void displayaz() // display azimuth value { int azd_round = (azg - offsetaz) * 10; azd_round -= azd_round % 5; float azd = 0.1f*azd_round; if (azd >= 360) {azd = azd - 360;} else if (azd < 0) {azd = 360 + azd;} // az has always a positive value int upper_part = azd; int lower_part = (int)(10*azd) % 10; char buffer [17]; sprintf (buffer, "Azimuth %3d.%1d ", upper_part, lower_part); lcd.setCursor (0, 0); lcd.print (buffer); } void displayel() // display elevation value { eld = el + offsetel; int upper_part = eld; int lower_part = (int)abs(10*eld) % 10; char buffer [17]; if (eld <-0.05 & eld >-1) {sprintf (buffer, "Elevation -%1d.%1d ", upper_part, lower_part);} else sprintf (buffer, "Elevation %3d.%1d ", upper_part, lower_part); lcd.setCursor (0, 1); lcd.print (buffer); } void readstatebuttons() { stateoffazup = digitalRead(offazup); stateoffazdn = digitalRead(offazdn); stateoffelup = digitalRead(offelup); stateoffeldn = digitalRead(offeldn); } void offsetcorrection() { if (stateoffazup == LOW) { offsetaz = offsetaz + 0.5; displayaz(); delay (d); if (d > 30) { d = d-30; } } if (stateoffazdn == LOW) {offsetaz = offsetaz - 0.5; displayaz(); delay (d); if (d > 30){d = d-30;}} if (stateoffelup == LOW) {offsetel = offsetel + 0.1; displayel(); delay (200);} if (stateoffeldn == LOW) {offsetel = offsetel - 0.1; displayel(); delay (200);} // writing offset data to EEPROM EEPROM.write (EEPROM_ADDR_STATUS, 1); char* p_mem = (char*)(&offsetaz); EEPROM.write (EEPROM_ADDR_OFFSET_AZ , p_mem [0]); EEPROM.write (EEPROM_ADDR_OFFSET_AZ+1, p_mem [1]); EEPROM.write (EEPROM_ADDR_OFFSET_AZ+2, p_mem [2]); EEPROM.write (EEPROM_ADDR_OFFSET_AZ+3, p_mem [3]); p_mem = (char*)(&offsetel); EEPROM.write (EEPROM_ADDR_OFFSET_EL , p_mem [0]); EEPROM.write (EEPROM_ADDR_OFFSET_EL+1, p_mem [1]); EEPROM.write (EEPROM_ADDR_OFFSET_EL+2, p_mem [2]); EEPROM.write (EEPROM_ADDR_OFFSET_EL+3, p_mem [3]); readstatebuttons(); }