#include <Wire.h>
#include <LiquidCrystal_I2C.h>
/* ===== PIN CONFIG ===== */
#define DIP1 D3
#define DIP2 D4
#define DIP3 D5
#define DIP4 D6
#define DIP5 D7
#define ANALOG_IN A0
#define PULSE_OUT D9
#define I2C_SDA D2
#define I2C_SCL D8
LiquidCrystal_I2C lcd(0x27, 20, 4);
/* ===== MODE ===== */
int getMode() {
if (digitalRead(DIP1)) return 1;
if (digitalRead(DIP2)) return 2;
if (digitalRead(DIP3)) return 3;
if (digitalRead(DIP4)) return 4;
if (digitalRead(DIP5)) return 5;
return 0;
}
/* ===== ADC ===== */
float adcToVoltage(int adc) {
return (adc * 3.3f) / 4095.0f;
}
/* ===== CONVERT ===== */
float convertToHz(float v, int mode) {
switch (mode) {
case 1: return constrain(v / 10.0 * 1000.0, 0, 1000); // 0-10V
case 2: return constrain((v - 1.0) / 4.0 * 1000.0, 0, 1000); // 4-20mA
case 3: return constrain(v / 5.0 * 1000.0, 0, 1000); // 0-20mA
case 4: return constrain((v - 1.65) / 3.3 * 1000.0 + 500, 0, 1000); // +-10V
case 5: return constrain((v - 1.65) / 3.3 * 1000.0 + 500, 0, 1000); // +-20mA
}
return 0;
}
/* ===== PULSE ===== */
void setPulse(float hz) {
if (hz < 1) {
analogWrite(PULSE_OUT, 0);
return;
}
analogWriteFrequency((uint32_t)hz);
analogWrite(PULSE_OUT, 128); // 50%
}
/* ===== MODE NAME ===== */
const char* modeName(int mode) {
switch (mode) {
case 1: return "MODE 1 : 0-10V";
case 2: return "MODE 2 : 4-20mA";
case 3: return "MODE 3 : 0-20mA";
case 4: return "MODE 4 : +-10V";
case 5: return "MODE 5 : +-20mA";
}
return "NO MODE";
}
/* ===== SETUP ===== */
void setup() {
pinMode(DIP1, INPUT);
pinMode(DIP2, INPUT);
pinMode(DIP3, INPUT);
pinMode(DIP4, INPUT);
pinMode(DIP5, INPUT);
pinMode(PULSE_OUT, OUTPUT);
Wire.setSDA(I2C_SDA);
Wire.setSCL(I2C_SCL);
Wire.begin();
lcd.init();
lcd.backlight();
}
/* ===== LOOP ===== */
void loop() {
int mode = getMode();
int adc = analogRead(ANALOG_IN);
float v = adcToVoltage(adc);
float hz = convertToHz(v, mode);
setPulse(hz);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(modeName(mode));
lcd.setCursor(0, 1);
lcd.print("ADC: ");
lcd.print(adc);
lcd.setCursor(0, 2);
lcd.print("FREQ: ");
lcd.print(hz, 1);
lcd.print(" Hz");
lcd.setCursor(0, 3);
if (hz > 0) {
lcd.print("PERIOD: ");
lcd.print(1000.0 / hz, 2);
lcd.print(" ms");
} else {
lcd.print("PERIOD: ---");
}
delay(300);
}