#define CHARGE_PIN 3 #define DISCHARGE_PIN 2 #define VOLTAGE_CHECK_PIN 0 // Definicje skalowania // Wartość dla 0% wilgotności #define HUMIDITY_0 4000 // Wartość dla 100% wilgotności #define HUMIDITY_100 4716 // 1 - Tryb kalibracji // 0 - Tryb pomiaru w jednostkach #define CALIBRATION 1 int counter = 0; unsigned long charge() { // Ustawienie PINów a tryb ładowania pinMode(DISCHARGE_PIN, INPUT); unsigned long begin_time = micros(); // Pobranie początkowego czasu pinMode(CHARGE_PIN, OUTPUT); digitalWrite(CHARGE_PIN, HIGH); // Oczekiwanie na osiągnięcie przez kondensator 63,2% napięcia zasilania while (analogRead(VOLTAGE_CHECK_PIN) < 648); unsigned long end_time = micros(); // Pobranie końcowego czasu return end_time - begin_time; // Obliczenie czasu ładowania } void discharge() { // Ustawienie PINów w tryb rozładowywania pinMode(CHARGE_PIN, INPUT); digitalWrite(CHARGE_PIN, LOW); pinMode(DISCHARGE_PIN, OUTPUT); digitalWrite(DISCHARGE_PIN, LOW); // Oczekiwanie na osiągnięcie przez kondensator 0 V while (analogRead(VOLTAGE_CHECK_PIN) > 0); } unsigned int get_humidity() { discharge(); // rozładowywanie unsigned long charge_time = charge(); // Ładowanie z mierzeniem czasu // Skalowanie unsigned int humidity = map(charge_time, HUMIDITY_0, HUMIDITY_100, 0, 100); // Tryb kalibracji (1) lub tryb pomiaru (0) if (CALIBRATION == 1) return charge_time; else return humidity; } void setup() { Serial.begin(9600); } void loop() { unsigned int humidity; // Czujnik wymaga częstego pomiaru // Co setny pomiar jest wyświetlany while (counter < 100) { humidity = get_humidity(); counter++; } Serial.println(humidity, DEC); counter = 0; }