#include <Ultrasonic.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <WiFi.h>
#include <HTTPClient.h>
// Servo Motor (Automatic Feeder)
#define SERVO_PIN 13
int servoAngle = 0;
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// ThingSpeak API details
const char* server = "http://api.thingspeak.com/update";
String apiKey = "XGDQDH1R36T0UNH2";
void setup() {
// Initialize Serial Monitor
Serial.begin(115200);
// Initialize servo motor using analogWrite
pinMode(SERVO_PIN, OUTPUT);
// Connect to WiFi
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi...");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("Connected!");
}
void loop() {
// Fixed Water Level (e.g., 100 cm)
long waterLevel = 100;
Serial.print("Water Level: ");
Serial.println(waterLevel);
// Fixed Water Temperature (e.g., 25.0 °C)
float waterTemp = 25.0;
Serial.print("Water Temperature: ");
Serial.println(waterTemp);
// Control the Feeder (Simple Schedule or Condition-based)
static unsigned long lastFeedTime = 0;
if (millis() - lastFeedTime > 60000) { // Feed every minute
servoAngle = 90; // Set angle to 90 degrees
int dutyCycle = map(servoAngle, 0, 180, 0, 255); // Convert angle to duty cycle for analogWrite
analogWrite(SERVO_PIN, dutyCycle);
delay(1000); // Hold position
servoAngle = 0; // Return to 0 degrees
dutyCycle = map(servoAngle, 0, 180, 0, 255);
analogWrite(SERVO_PIN, dutyCycle);
lastFeedTime = millis();
Serial.println("Feeding the fish...");
}
// Send data to ThingSpeak
if(WiFi.status() == WL_CONNECTED){
HTTPClient http;
String url = String(server) + "?api_key=" + apiKey + "&field1=" + String(waterLevel) + "&field2=" + String(waterTemp);
http.begin(url);
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
String response = http.getString();
Serial.println("Data sent to ThingSpeak: " + response);
} else {
Serial.println("Error in sending data to ThingSpeak");
}
http.end();
}
// Delay before next loop
delay(1000);
}