#include #include #define MULTIPLEX_PINA D5 #define MULTIPLEX_PINB D6 #define MULTIPLEX_PINC D7 #define ANALOG_PIN A0 /* 000 0 001 1 010 2 011 3 100 4 101 5 110 6 111 7 */ #define SOIL_A 0 #define SOIL_B 6 #define WATER_LEVEL_A 2 #define WATER_LEVEL_B 4 // Ref https://stackoverflow.com/a/523737/1460422 #define CHECK_BIT(var,pos) ((var) & (1<<(pos))) int soilPin = D3; float referenceVoltage = 3.3; float read_analog(int channel) { const char* bin = std::bitset<8>(channel).to_string().c_str(); bool b0 = bin[7] == u'1'; bool b1 = bin[6] == u'1'; bool b2 = bin[5] == u'1'; digitalWrite(MULTIPLEX_PINA, b2); digitalWrite(MULTIPLEX_PINB, b1); digitalWrite(MULTIPLEX_PINC, b0); int rawValue = analogRead(ANALOG_PIN); float parsedValue = ((float)rawValue) / 1024.0 * referenceVoltage; return parsedValue; } void setup() { Serial.begin(9600); Serial.println("Analogue Soil Sensor Test"); Serial.println("========================="); pinMode(MULTIPLEX_PINA, OUTPUT); pinMode(MULTIPLEX_PINB, OUTPUT); pinMode(MULTIPLEX_PINC, OUTPUT); } void loop() { Serial.print("SOIL_A\t"); Serial.println(read_analog(SOIL_A)); Serial.print("SOIL_B\t"); Serial.println(read_analog(SOIL_B)); Serial.print("WATER_LEVEL_A\t"); Serial.println(read_analog(WATER_LEVEL_A)); Serial.print("WATER_LEVEL_B\t"); Serial.println(read_analog(WATER_LEVEL_B)); Serial.println("\n\n\n\n\n"); delay(5000); }