From d038eb1280c4c3597dcd3869d4a37fb7253a8594 Mon Sep 17 00:00:00 2001 From: Ricardo Date: Tue, 28 Jan 2020 22:00:00 +0000 Subject: [PATCH] Initiated firmware version 1.0 --- Todo | 7 + firmware/1.0/Makefile | 14 ++ firmware/1.0/v01.ino | 453 +++++++++++++++++++++++++++++++++++++++++ pcb/RevA/fp-info-cache | 1 + pcb/RevA/lc1.ods | Bin 0 -> 16288 bytes pcb/RevA/lc1.pro | 2 +- 6 files changed, 476 insertions(+), 1 deletion(-) create mode 100644 firmware/1.0/Makefile create mode 100644 firmware/1.0/v01.ino create mode 100644 pcb/RevA/fp-info-cache create mode 100644 pcb/RevA/lc1.ods diff --git a/Todo b/Todo index ba40709..fabf4e7 100644 --- a/Todo +++ b/Todo @@ -1,4 +1,11 @@ Add temperature sensor + Make it 2 relays + Add more self explanatory labels on the chips + +Add a diode from the power module Plus(+) into the circuit +and add a diode from USB connector Plus(+) into the circuit + + diff --git a/firmware/1.0/Makefile b/firmware/1.0/Makefile new file mode 100644 index 0000000..939d6da --- /dev/null +++ b/firmware/1.0/Makefile @@ -0,0 +1,14 @@ +# Arduino Make file. Refer to https://github.com/sudar/Arduino-Makefile + +BOARD_TAG = pro +BOARD_SUB = 8MHzatmega328 +USER_LIB_PATH += /home/ricardo/Arduino/libraries +ARDUINO_LIBS += Adafruit_GFX_Library \ + SoftwareSerial \ + Adafruit_SSD1306 \ + SPI \ + Wire +ARDUINO_DIR = /home/ricardo/Installs/arduino-1.8.7 +MONITOR_PORT = /dev/ttyUSB0 +-include /usr/share/arduino/Arduino.mk +-include /home/ricardo/Installs/Arduino-Makefile-1.6.0/Arduino.mk diff --git a/firmware/1.0/v01.ino b/firmware/1.0/v01.ino new file mode 100644 index 0000000..284b8a6 --- /dev/null +++ b/firmware/1.0/v01.ino @@ -0,0 +1,453 @@ +/********************************************************************* + NMM-1 +NMEA0183 serial Monitor. + +By Jony Silva +Wed 24 Jan 23:11:25 GMT 2018 +*********************************************************************/ + +// Libraries to be included +#include +#include +#include +#include +#include + +#define OLED_RESET 8 +#define SCREEN_WIDTH 128 // OLED display width, in pixels +#define SCREEN_HEIGHT 56 // OLED display height, in pixels +// create display object for oled display +Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); + +#define ON 0 // ON means pin is on GND +#define OFF 1 // OFF means pin is on VCC + +// Assign switches and led's to arduino pins +#define UP 2 // Switch 1 will be function UP connected to arduino PD 2 +#define OK 3 // Switch 2 will be function OK connected to arduino pin 3 +#define DOWN 4 // Switch 3 will be function DOWN connected to arduino pin 4 +#define CANCEL 5 // Switch 4 will be function CANCEL connected to arduino pin 5 +#define led1 9 // Led 1 connected to arduino pin 9 +#define led2 10 // Led 2 connected to arduino pin 10 +#define batt 17 // Battery plus connected to arduino pin 17 + +// Macros to read the switchs +#define rUP digitalRead(UP) // Read button UP state +#define rOK digitalRead(OK) // Read button OK state +#define rDOWN digitalRead(DOWN) // Read button DOWN state +#define rCANCEL digitalRead(CANCEL) // Read button CANCEL state + + +// Function declarations +void one(); // Menu one +void two(); // Menu two +void three(); // Menu three +void four(); // Menu four +void read_serial(); // Menu that reads the serial +void write_gps(); // Menu that writes gps out to serial +void write_hdg(); // Menu that writes hdg out to serial +void write_dep(); // Menu that writes dep out to serial +void batt_icon(); // Draws the battery icon acording to value +void write_serial(); // Menu that writes to serial + + + +// Variables creation +int menuState = 1; // Integer with the number of the menu you are in +int prevMenu = 1; // Previous menu +int UP_state = OFF; // Holds state for UP, either ON or OFF +int OK_state = OFF; // Holds state for OK, either ON or OFF +int DOWN_state = OFF; // Holds state for DOWN, either ON or OFF +int CANCEL_state = OFF; // Holds state for CANCEL, either ON or OFF +int batt_val = 0; // Holds the value of battery voltage +int read_s = 0; // Serial flag, if 0 not reading, if 1 is reading + + +// Create SoftwareSerial object and designate pins + SoftwareSerial mySerial(6, 7); // RX, TX + +void setup() { // BEGIN SETUP ------------------------------------ + + + pinMode(led1, OUTPUT); // Led 1 is an output + pinMode(led2, OUTPUT); // Led 2 is an output + pinMode(UP, INPUT); // Switch 1 is an input + pinMode(OK, INPUT); // Switch 2 is an input + pinMode(DOWN, INPUT); // Switch 3 is an input + pinMode(CANCEL, INPUT); // Switch 4 is an input + + // Define the starting state of the led's + digitalWrite(led1,HIGH); // Turn off led 1 + digitalWrite(led2,HIGH); // Turn off led 2 + + // set the data rate for the Serial port + Serial.begin(4800); + + // by default, we'll generate the high voltage from the 3.3v line internally! (neat!) + display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32) + // init done + + + // initialize timer1 --------------------------------------- + noInterrupts(); // disable all interrupts + TCCR1A = 0; + TCCR1B = 0; + TCNT1 = 0; + + OCR1A = 9000; // Load value to compare + TCCR1B |= (1 << WGM12); // CTC mode + TCCR1B |= (1 << CS10); // 64 prescaler + TCCR1B |= (1 << CS11); // + TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt + interrupts(); // enable all interrupts + // ---------------------------------------------------------- + + + // Clear the buffer. + display.clearDisplay(); // Clean display + display.display(); // Refresh display + + display.setTextSize(2); // Set text size on the display + display.setTextColor(WHITE); // Set text color on the display + display.setCursor(36,18); // Set the display cursor to position + display.println("NMM-1"); // Print on display + display.display(); // Refresh display + delay(3000); + display.clearDisplay(); // Clean display + display.display(); // Refresh display + +} // END SETUP -------------------------------------------------------------------- + + + +// Timer compare interrupt service routine -------------------------- +ISR(TIMER1_COMPA_vect) +{ + if (!rUP) // If button UP pressed + { + if (menuState == 1){} // Do nothing and leave menuState + // as it is (1) + else { + menuState--; + } + while (!rUP); // Check if button is still pressed, do nothing + } + + + if (!rDOWN) // If button DOWN pressed + { + if (menuState == 4){} // Do nothing and leave menuState + // as it is (4) + else { + menuState++; + } + while (!rDOWN); // Check if button is still pressed, do nothing + } + + + if (!rOK) // If button OK pressed + { + if (menuState == 1) // and the menuState is 1 + { + prevMenu = menuState; // set prevMenu to 1 + menuState = 10; // then reset menuState to 10 + } + else if (menuState == 2) // If menuState is 2 + { + prevMenu = menuState; // set prevMenu to 2 + menuState = 11; // then reset menuState to 11 + } + else if (menuState == 3) // If menuState is 3 + { + prevMenu = menuState; // set prevMenu to 3 + menuState = 12; // then reset menuState to 12 + } + else if (menuState == 4) // If menuState is 4 + { + prevMenu = menuState; // set prevMenu to 4 + menuState = 13; // then reset menuState to 13 + } + while (!rOK); // Check if button is still pressed, do nothing + } + + if (!rCANCEL) // If button CANCEL pressed + { + menuState = prevMenu; // set menuState to same value as prevMenu + while (!rCANCEL); // Check if button is still pressed, do nothing + } + +} +// End of Timer compare interrupt --------------------------------------- + + +// Main loop routine ----------------------------------------- +void loop() +{ + + batt_val = analogRead(batt); // Read analog value from battery into batt_val + + if (menuState == 1) // If menuState is 1 + { + one(); // call function one() + mySerial.end(); // close serial connection + read_s = 0; // and set read_s to 0 + } + else if (menuState == 2) // If menuState is 2 + { + two(); // call function two() + mySerial.end(); // close serial connection + read_s = 0; // and set read_s to 0 + } + else if (menuState == 3) // If menuState is 3 + { + three(); // call function three() + mySerial.end(); // close serial connection + read_s = 0; // and set read_s to 0 + } + else if (menuState == 4) // If menuState is 4 + { + four(); // call function four() + mySerial.end(); // close serial connection + read_s = 0; // and set read_s to 0 + } + else if (menuState == 10) // If menuState is 10 + { + if (read_s == 0) // and read_s is 0 + { + mySerial.begin(4800); // Start serial with 4800bps + read_s = 1; // set read_s to 1 + display.clearDisplay(); // Clean display + display.setTextSize(1); // Set text size on the display + display.setTextColor(WHITE); // Set text color on the display + display.setCursor(1,17); // Set the display cursor to position + display.println("Sending GPS....."); // Print on display + batt_icon(); // call function batt_icon() + display.display(); // Refresh display + } + write_gps(); // call function write_gps() + } + else if (menuState == 11) // If menuState is 11 + { + if (read_s == 0) // and read_s is 0 + { + mySerial.begin(4800); // Start serial with 4800bps + read_s = 1; // set read_s to 1 + display.clearDisplay(); // Clean display + display.setTextSize(1); // Set text size on the display + display.setTextColor(WHITE); // Set text color on the display + display.setCursor(1,17); // Set the display cursor to position + display.println("Sending Heading....."); // Print on display + batt_icon(); // call function batt_icon() + display.display(); // Refresh display + } + write_hdg(); // call function write_hdg() + } + else if (menuState == 12) // If menuState is 12 + { + if (read_s == 0) // and read_s is 0 + { + mySerial.begin(4800); // Start serial with 4800bps + read_s = 1; // set read_s to 1 + display.clearDisplay(); // Clean display + display.setTextSize(1); // Set text size on the display + display.setTextColor(WHITE); // Set text color on the display + display.setCursor(1,17); // Set the display cursor to position + display.println("Sending Depth....."); // Print on display + batt_icon(); // call function batt_icon() + display.display(); // Refresh display + } + write_dep(); // call function write_dep() + } + else if (menuState == 13) // If menuState is 13 + { + if (read_s == 0) // and read_s is 0 + { + mySerial.begin(4800); // Start serial with 4800bps + read_s = 1; // set read_s to 1 + display.clearDisplay(); // Clean display + display.setTextSize(1); // Set text size on the display + display.setTextColor(WHITE); // Set text color on the display + display.setCursor(1,17); // Set the display cursor to position + display.println("RS-422 to USB"); // Print on display + display.println("Sending..."); // Print on display + batt_icon(); // call function batt_icon() + display.display(); // Refresh display + } + read_serial(); // call function read_serial() + } + else // otherwise + { + one(); // call function one() + mySerial.end(); // close serial connection + read_s = 0; // set read_s to 0 + } +} +// END of Main loop routine ----------------------------------------- + + + +void batt_icon (void) +{ + + + if (batt_val > 962) // If analog value is bigger then 962 + { + // Draw the battery icon - Full battery + display.drawRect(111, 1, 16, 6, WHITE); // Draw white reactangle with coordinates + display.drawRect(112, 2, 14, 4, WHITE); + display.drawRect(113, 3, 12, 2, WHITE); + display.drawPixel(110, 3, WHITE); // Draw white dot with coordinates + display.drawPixel(110, 4, WHITE); + display.drawPixel(109, 3, WHITE); + display.drawPixel(109, 4, WHITE); + display.drawPixel(108, 3, WHITE); + display.drawPixel(108, 4, WHITE); + } + + else if ((batt_val > 901) & (batt_val < 962)) // If analog value is between 901 and 962 + { + // Draw the battery icon - 2/3 battery + display.drawRect(111, 1, 16, 6, WHITE); // Draw white reactangle with coordinates + display.drawRect(116, 2, 10, 4, WHITE); + display.drawRect(117, 3, 8, 2, WHITE); + display.drawPixel(110, 3, WHITE); // Draw white dot with coordinates + display.drawPixel(110, 4, WHITE); + display.drawPixel(109, 3, WHITE); + display.drawPixel(109, 4, WHITE); + display.drawPixel(108, 3, WHITE); + display.drawPixel(108, 4, WHITE); + } + + else if ((batt_val > 840) & (batt_val < 901)) // If analog value is between 840 and 901 + { + // Draw the battery icon - 1/3 battery + display.drawRect(111, 1, 16, 6, WHITE); // Draw white reactangle with coordinates + display.drawRect(121, 2, 5, 4, WHITE); + display.drawRect(122, 3, 3, 2, WHITE); + display.drawPixel(110, 3, WHITE); // Draw white dot with coordinates + display.drawPixel(110, 4, WHITE); + display.drawPixel(109, 3, WHITE); + display.drawPixel(109, 4, WHITE); + display.drawPixel(108, 3, WHITE); + display.drawPixel(108, 4, WHITE); + } + + else // otherwise + { + // Draw the battery icon - Empty battery + display.setCursor(35,1); // Set the display cursor to position + display.println("BATT LOW"); // Print on display + display.drawRect(111, 1, 16, 6, WHITE); // Draw white reactangle with coordinates + display.drawPixel(110, 3, WHITE); // Draw white dot with coordinates + display.drawPixel(110, 4, WHITE); + display.drawPixel(109, 3, WHITE); + display.drawPixel(109, 4, WHITE); + display.drawPixel(108, 3, WHITE); + display.drawPixel(108, 4, WHITE); + } +} + +void one (void) +{ + display.clearDisplay(); // Clean display + display.setTextSize(1); // Set text size on the display + display.setTextColor(WHITE); // Set text color on the display + display.setCursor(1,18); // Set the display cursor to position + display.println("Send GPS <--"); // Print on display + display.setCursor(1,28); // Set the display cursor to position + display.println("Send Heading"); // Print on display + display.setCursor(1,38); // Set the display cursor to position + display.println("Send Depth"); // Print on display + display.setCursor(1,48); // Set the display cursor to position + display.println("RS422 <==> USB"); // Print on display + batt_icon(); // call function batt_icon() + display.display(); // Refresh display +} + +void two (void) +{ + display.clearDisplay(); // Clean display + display.setTextSize(1); // Set text size on the display + display.setTextColor(WHITE); // Set text color on the display + display.setCursor(1,18); // Set the display cursor to position + display.println("Send GPS"); // Print on display + display.setCursor(1,28); // Set the display cursor to position + display.println("Send Heading <--"); // Print on display + display.setCursor(1,38); // Set the display cursor to position + display.println("Send Depth"); // Print on display + display.setCursor(1,48); // Set the display cursor to position + display.println("RS422 <==> USB"); // Print on display + batt_icon(); // call function batt_icon() + display.display(); // Refresh display +} + +void three (void) +{ + display.clearDisplay(); // Clean display + display.setTextSize(1); // Set text size on the display + display.setTextColor(WHITE); // Set text color on the display + display.setCursor(1,18); // Set the display cursor to position + display.println("Send GPS"); // Print on display + display.setCursor(1,28); // Set the display cursor to position + display.println("Send Heading"); // Print on display + display.setCursor(1,38); // Set the display cursor to position + display.println("Send Depth <--"); // Print on display + display.setCursor(1,48); // Set the display cursor to position + display.println("RS422 <==> USB"); // Print on display + batt_icon(); // call function batt_icon() + display.display(); // Refresh display +} + +void four (void) +{ + display.clearDisplay(); // Clean display + display.setTextSize(1); // Set text size on the display + display.setTextColor(WHITE); // Set text color on the display + display.setCursor(1,18); // Set the display cursor to position + display.println("Send GPS"); // Print on display + display.setCursor(1,28); // Set the display cursor to position + display.println("Send Heading"); // Print on display + display.setCursor(1,38); // Set the display cursor to position + display.println("Send Depth"); // Print on display + display.setCursor(1,48); // Set the display cursor to position + display.println("RS422 <==> USB <--"); // Print on display + batt_icon(); // call function batt_icon() + display.display(); // Refresh display +} + +void read_serial (void) +{ + if (mySerial.available()) // If incoming NMEA0183 serial + { + Serial.write(mySerial.read()); // redirect it to USB + } + + if (Serial.available()) // If incoming USB serial + { + mySerial.write(Serial.read()); // redirect it to NMEA0183 serial + } +} + +void write_gps (void) +{ + // Write NMEA0183 GPS sentence to USB + mySerial.print("$GPGGA,090000.10,6350.37829338,N,02225.18272240,W,1,05,2.87,160.00,M,-21.3213,M,,*64"); + mySerial.println(); // Send string to NMEA0183 serial + delay(100); +} + +void write_hdg (void) +{ + // Write NMEA0183 Heading sentence to USB + mySerial.print("$HEHDT,268.4,T*27"); + mySerial.println(); // Send string to NMEA0183 serial + delay(100); +} + +void write_dep (void) +{ + // Write NMEA0183 Depth sentence to USB + mySerial.print("$SDDBT,0038.0,f,0011.6,M,0006.3,F"); + mySerial.println(); // Send string to NMEA0183 serial + delay(100); +} diff --git a/pcb/RevA/fp-info-cache b/pcb/RevA/fp-info-cache new file mode 100644 index 0000000..573541a --- /dev/null +++ b/pcb/RevA/fp-info-cache @@ -0,0 +1 @@ +0 diff --git a/pcb/RevA/lc1.ods b/pcb/RevA/lc1.ods new file mode 100644 index 0000000000000000000000000000000000000000..f52fbb78a1082394a8e1e3c5c686f33574a2e7db GIT binary patch literal 16288 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

nnFG;V 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 literal 0 HcmV?d00001 diff --git a/pcb/RevA/lc1.pro b/pcb/RevA/lc1.pro index 1883ec2..239f219 100644 --- a/pcb/RevA/lc1.pro +++ b/pcb/RevA/lc1.pro @@ -1,4 +1,4 @@ -update=Thu 10 Jan 2019 23:23:46 GMT +update=Fri 21 Jun 2019 22:13:04 GMT version=1 last_client=kicad [pcbnew]