/*
#####################################################
# ### ### #
-# ### CODE for ESP32 of LANToI2C_Board_264 ### #
+# ### CODE for ESP32 of LANToI2C_Board ### #
# ### for START TELNET SERVER ### #
# ### for LAN to I2C ### #
# ### connected to 4 CH ADC ### #
# ### connected to 0.91 OLED Display ### #
+# ### use EEPROM to save settings ### #
# ### ### #
# ### author: O.Artz ### #
# ### ### #
-# ### UPDATE 2022-06-07 ### #
+# ### UPDATE 2022-06-21 ### #
# ### ### #
#####################################################
#include <Adafruit_ADS1015.h> //for external ADC
#include <ETH.h> //for Telnet Server Connection
#include <Wire.h> //for I2C Connection
+#include <EEPROM.h> //to save settings
//__________________________________________
#include <Adafruit_SSD1306.h> //for OLED display driver
#include <SPI.h> //for display control
+// define the number of bytes you want to access
+/*
+ * Address Value
+ * 0x11 ADC measurment range
+ * 0x12 Unit
+ * 0x13, 0x14 Device Transformationfactor
+ * 0x21, 0x22 Voltage divider
+ * 0x31, 0x32 Offset CH 0
+ * 0x33, 0x34 Offset CH 1
+ * 0x35, 0x36 Offset CH 2
+ * 0x37, 0x38 Offset CH 3
+ */
+#define EEPROM_SIZE 512
+
// for screen
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
bool show_connection = true;
uint8_t rxcnt = 0, txpoint = 0;
uint8_t rxbuf[11], txbuf[12];
-uint8_t val, new_gain, new_unit;
+uint8_t new_gain, new_unit;
float vol_div_fac, dev_trans_fac;
uint16_t new_vol_div_fac, new_dev_trans_fac;
+int16_t new_offset_val;
int16_t adc0, adc1, adc2, adc3;
float fadc0, fadc1, fadc2, fadc3;
float offset0, offset1, offset2, offset3;
-int16_t new_offset_val;
int chan_offset_num, offset_val;
uint8_t setGAIN = 0xFFFF;
float setADCconversion;
float acGAIN[] = {0.1875, 0.125, 0.0625, 0.03125, 0.015625, 0.0078125};
adsGain_t asetGAIN[] = {GAIN_TWOTHIRDS, GAIN_ONE, GAIN_TWO, GAIN_FOUR, GAIN_EIGHT, GAIN_SIXTEEN};
int counter = 0;
-String possible_units[] = {"mV", "mA", "mbar", "degC"};
+String possible_units[] = {"mV", "mA", "mbar", "mPa" "degC"};
String unit;
void WiFiEvent(WiFiEvent_t event) {
connection_screen();
// test_screen();
+ EEPROM.begin(EEPROM_SIZE);
//Setting for external ADC measurment range
// val ADS1015 ADS1115
// ------- -------
// 4 ads.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25mV 0.015625mV
// 5 ads.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125mV 0.0078125mV
- val = 2; // chose as default for external adc setting
- set_adc_gain(val);
+// new_gain = 2; // chose as default for external adc setting
+ new_gain = EEPROM.read(0x11);
+ set_adc_gain(new_gain);
// Chose right Unit
// val Unit
// 0 mV
// 1 mA
// 2 mbar
-// 3 degC
+// 3 mPa
+// 4 degC
- new_unit = 0; //default mV
+// new_unit = 0; //default
+ new_unit = EEPROM.read(0x12);
set_unit(new_unit);
-
-// Channel Offset
- new_offset_val = 0; //default
- chan_offset_num = 5; //default all channels
- set_offset(new_offset_val, chan_offset_num);
-
+
// Device Transformationfactor
- new_dev_trans_fac = 1000; //default
+// new_dev_trans_fac = 1000, //default
+ new_dev_trans_fac = EEPROM.read(0x13) | EEPROM.read(0x14) << 8;
set_device_transformation_factor(new_dev_trans_fac);
// Input voltage divider
- new_vol_div_fac = 1000; //default w/o voltage devider, 1000 cause will devider by 1000 to sent float by telnet
+// new_vol_div_fac = 1000; //default w/o voltage devider, 1000 cause will devider by 1000 to sent float by telnet
+ new_vol_div_fac = EEPROM.read(0x21) | EEPROM.read(0x22) << 8;
set_voltage_divider_factor(new_vol_div_fac);
+// Channel Offset
+// new_offset_val = 0; //default
+// CH 0
+ new_offset_val = EEPROM.read(0x31) | EEPROM.read(0x32) << 8;
+ chan_offset_num = 0;
+ set_offset(new_offset_val, chan_offset_num);
+// CH 1
+ new_offset_val = EEPROM.read(0x33) | EEPROM.read(0x34) << 8;
+ chan_offset_num = 1;
+ set_offset(new_offset_val, chan_offset_num);
+// CH 2
+ new_offset_val = EEPROM.read(0x35) | EEPROM.read(0x36) << 8;
+ chan_offset_num = 2;
+ set_offset(new_offset_val, chan_offset_num);
+// CH 3
+ new_offset_val = EEPROM.read(0x37) | EEPROM.read(0x38) << 8;
+ chan_offset_num = 3;
+ set_offset(new_offset_val, chan_offset_num);
+
Serial.print("\nADC Settings");
Serial.print("\nActual Gainfactor: ");
- Serial.print(asetGAIN[val]);
+ Serial.print(asetGAIN[new_gain]);
Serial.print("\nConversionfactor: ");
Serial.print(setADCconversion);
Serial.println();
-
}
void restart_screen() {
// the library initializes this with an Adafruit splash screen.
// display.display();
- delay(1000); // Pause for 2 seconds
+ delay(1000); // Pause for 1 second
display.clearDisplay();
}
void start_screen() {
// show ikf logo and initials of the programmer
display.clearDisplay();
+ display.ssd1306_command(SSD1306_SETCONTRAST);
+ display.ssd1306_command(0); // val=0 := 0% up to val = 255 := 100%
display.setTextSize(1); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.cp437(true); // Use full 256 char 'Code Page 437' font
display.setTextSize(1);
if (unit.length() == 4) {
display.setCursor(SCREEN_WIDTH * 10 / 28, SCREEN_HEIGHT * 2 / 5);
+ } else if (unit.length() == 3) {
+ display.setCursor(SCREEN_WIDTH * 23 / 56, SCREEN_HEIGHT * 2 / 5);
} else if (unit.length() == 2) {
display.setCursor(SCREEN_WIDTH * 11 / 28, SCREEN_HEIGHT * 2 / 5);
}
display.setTextSize(1);
if (unit.length() == 4) {
display.setCursor(SCREEN_WIDTH * 10 / 28, SCREEN_HEIGHT * 2 / 5);
+ } else if (unit.length() == 3) {
+ display.setCursor(SCREEN_WIDTH * 23 / 56, SCREEN_HEIGHT * 2 / 5);
} else if (unit.length() == 2) {
display.setCursor(SCREEN_WIDTH * 11 / 28, SCREEN_HEIGHT * 2 / 5);
}
}
}
-void set_voltage_divider_factor(float new_vol_div_fac) {
+void set_voltage_divider_factor(uint16_t new_vol_div_fac) {
// to set the correct voltage divider factor
vol_div_fac = new_vol_div_fac/1000.0;
}
-void set_device_transformation_factor(float new_dev_trans_fac) {
+void set_device_transformation_factor(uint16_t new_dev_trans_fac) {
// to transformate adc values in device values (units)
dev_trans_fac = new_dev_trans_fac/1000.0;
}
// (hex_to_int(rxbuf[7])*16+hex_to_int(rxbuf[8]))&0xFF;
new_gain = (hex_to_int(rxbuf[9]));
set_adc_gain(new_gain);
+ EEPROM.write(0x11, new_gain);
+ EEPROM.commit();
send_answer_hex(&rxbuf[0], new_gain);
}
if (hex_to_int(rxbuf[4]) == 0) {
new_unit = (hex_to_int(rxbuf[9]));
set_unit(new_unit);
-
+ EEPROM.write(0x12, new_unit);
+ EEPROM.commit();
+
send_answer_hex(&rxbuf[0], new_unit);
}
if (hex_to_int(rxbuf[4]) == 1) {
new_dev_trans_fac = (hex_to_int(rxbuf[6]) * 4096 + hex_to_int(rxbuf[7]) * 256 + hex_to_int(rxbuf[8]) * 16 + hex_to_int(rxbuf[9]));
set_device_transformation_factor(new_dev_trans_fac);
+ EEPROM.write(0x13, new_dev_trans_fac);
+ EEPROM.write(0x14, new_dev_trans_fac >> 8);
+ EEPROM.commit();
send_answer_hex(&rxbuf[0], new_dev_trans_fac);
}
if (hex_to_int(rxbuf[4]) == 2) {
new_vol_div_fac = (hex_to_int(rxbuf[6]) * 4096 + hex_to_int(rxbuf[7]) * 256 + hex_to_int(rxbuf[8]) * 16 + hex_to_int(rxbuf[9]));
set_voltage_divider_factor(new_vol_div_fac);
-
+ EEPROM.write(0x21, new_vol_div_fac);
+ EEPROM.write(0x22, new_vol_div_fac >> 8);
+ EEPROM.commit();
send_answer_hex(&rxbuf[0], new_vol_div_fac);
}
}
//offset
new_offset_val = (hex_to_int(rxbuf[6]) * 4096 + hex_to_int(rxbuf[7]) * 256 + hex_to_int(rxbuf[8]) * 16 + hex_to_int(rxbuf[9]));
chan_offset_num = (hex_to_int(rxbuf[4]));
- set_offset(new_offset_val, chan_offset_num);
+ set_offset(new_offset_val, chan_offset_num);
+ if (chan_offset_num == 0) {
+ EEPROM.write(0x31, new_offset_val);
+ EEPROM.write(0x32, new_offset_val >> 8);
+ EEPROM.commit();
+ } else if (chan_offset_num == 1) {
+ EEPROM.write(0x33, new_offset_val);
+ EEPROM.write(0x34, new_offset_val >> 8);
+ EEPROM.commit();
+ } else if (chan_offset_num == 2) {
+ EEPROM.write(0x35, new_offset_val);
+ EEPROM.write(0x36, new_offset_val >> 8);
+ EEPROM.commit();
+ } else if (chan_offset_num == 3) {
+ EEPROM.write(0x37, new_offset_val);
+ EEPROM.write(0x38, new_offset_val >> 8);
+ EEPROM.commit();
+ } else if (chan_offset_num == 5) {
+ EEPROM.write(0x31, new_offset_val);
+ EEPROM.write(0x32, new_offset_val >> 8);
+ EEPROM.write(0x33, new_offset_val);
+ EEPROM.write(0x34, new_offset_val >> 8);
+ EEPROM.write(0x35, new_offset_val);
+ EEPROM.write(0x36, new_offset_val >> 8);
+ EEPROM.write(0x37, new_offset_val);
+ EEPROM.write(0x38, new_offset_val >> 8);
+ EEPROM.commit();
+ }
send_answer_hex(&rxbuf[0], new_offset_val);
}