Untitled
unknown
plain_text
a year ago
4.9 kB
6
Indexable
#include <OneWire.h>
#include <DallasTemperature.h>
#define SENSOR_OUT_PIN A0 // Pin connected to the analog output of the soil moisture sensor
#define SENSOR_DIS_PIN 12 // Pin connected to the DIS (disable) pin of the soil moisture sensor
#define SENSOR_VCC_PIN 13 // Pin connected to the VCC (supply voltage) pin of the soil moisture sensor
#define ONE_WIRE_BUS 4 // Pin connected to the data wire of the DS18B20+ temperature sensor
#define PHOTO_RESISTOR_PIN A1 // Pin connected to the photoresistor
#define SERVO_PIN 18 // Pin connected to the servo motor
// Data wire is plugged into port 4 on the Arduino
OneWire oneWire(ONE_WIRE_BUS);
// Setup a oneWire instance to communicate with any OneWire devices
DallasTemperature sensors(&oneWire);
bool sensorPowerOn = false; // Variable to track soil moisture sensor power status
// Function to initialize the servo motor
void initServo() {
ledc_timer_config_t timer_conf = {
.duty_resolution = LEDC_TIMER_13_BIT, // 13-bit duty resolution
.freq_hz = 50, // PWM frequency 50Hz (standard for servo)
.speed_mode = LEDC_HIGH_SPEED_MODE, // High-speed mode
.timer_num = LEDC_TIMER_0 // Timer 0
};
ledc_timer_config(&timer_conf);
ledc_channel_config_t ledc_conf = {
.gpio_num = SERVO_PIN,
.speed_mode = LEDC_HIGH_SPEED_MODE,
.channel = LEDC_CHANNEL_0,
.intr_type = LEDC_INTR_DISABLE,
.timer_sel = LEDC_TIMER_0,
.duty = 0
};
ledc_channel_config(&ledc_conf);
}
// Function to control the servo motor
void controlServo(int speed, float rotation_time) {
int angle = (speed * 180) / 100; // Convert speed to angle
float duty_cycle = (angle / 18.0) + 2.5; // Convert angle to duty cycle
ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, duty_cycle * (1 << 13));
ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0);
vTaskDelay(pdMS_TO_TICKS((rotation_time / 2) * 1000)); // Wait for half of the rotation time
ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, 0); // Stop the servo
ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0);
}
// Function to read the moisture voltage
float readMoistureVoltage() {
// Turn on the soil moisture sensor power if it's off
if (!sensorPowerOn) {
digitalWrite(SENSOR_VCC_PIN, HIGH);
delay(10); // Delay for stability
sensorPowerOn = true;
}
// Read analog output from the soil moisture sensor
int sensorValue = analogRead(SENSOR_OUT_PIN);
// Convert analog value to voltage (assuming 10-bit ADC)
float voltage = sensorValue * (5.0 / 1023.0);
// Turn off the soil moisture sensor power after reading
digitalWrite(SENSOR_VCC_PIN, LOW);
sensorPowerOn = false;
return voltage;
}
// Function to determine moisture level
String determineMoistureLevel(float voltage) {
if (voltage >= 1.4 && voltage <= 1.8) {
return "WET";
} else if (voltage > 1.8 && voltage <= 2.1) {
return "MOIST";
} else if (voltage > 2.1 && voltage <= 2.3) {
return "DRY";
} else {
return "UNKNOWN";
}
}
// Function to read the temperature
float readTemperature() {
sensors.requestTemperatures(); // Send the command to get temperatures
return sensors.getTempCByIndex(0); // Read temperature in Celsius from DS18B20+ sensor
}
// Function to read the light level
String readLightLevel() {
// Read analog voltage from the photoresistor
int lightSensorValue = analogRead(PHOTO_RESISTOR_PIN);
// Convert analog value to voltage (assuming 10-bit ADC)
float lightVoltage = lightSensorValue * (5.0 / 1023.0);
// Determine light level based on voltage
if (lightVoltage < 0.5) {
return "Dark";
} else if (lightVoltage >= 0.5 && lightVoltage <= 2.5) {
return "Medium";
} else {
return "Bright";
}
}
void setup() {
Serial.begin(9600);
pinMode(SENSOR_DIS_PIN, OUTPUT);
pinMode(SENSOR_VCC_PIN, OUTPUT);
// Initialize DS18B20+ temperature sensor
sensors.begin();
// Initialize servo
initServo();
}
void loop() {
// Read and print the readings
float moistureVoltage = readMoistureVoltage();
String moistureLevel = determineMoistureLevel(moistureVoltage);
Serial.println("Moisture Reading:");
Serial.println("Voltage: " + String(moistureVoltage) + " V");
Serial.println("Moisture Level: " + moistureLevel);
float temperatureC = readTemperature();
Serial.println("Temperature: " + String(temperatureC) + " °C");
String lightLevel = readLightLevel();
Serial.println("Light Level: " + lightLevel);
// Control the servo motor
controlServo(50, 2.0); // Example: Rotate at 50% speed for 2 seconds
delay(5000); // Delay for 5 seconds before next reading
}
Editor is loading...
Leave a Comment