Instructions

Board Connect

Connect The ESP32 Board

Make sure all your componets are working finely and this is how you're gonna setup your ESP32 Board

Board Connect

Make Sure Your Heat Sensor Works

You have to get a sensor that is named as DS18B20 Sensor. It's for calculating the heat of the water

Board Connect

Connect The ULN2003AN to the board

ULN2003AN has the socket to connect stepper motoer to the ESP32 board. So connect and check if it works

Board Connect

All Set ?

Before Powering up make sure all components are connected safely

Board Connect

Power Up

Connect the ESP32 Board into your PC and run the code

Board Connect

Get The output

Now watch the serial monitor and make sure all the things are working nicely

Automation System

This How Our System Coded As. We provide you the whole code for your project.


Heat Sensor (DS18B20)

Simple Code

ESP32 DS18B20 Sample Code
// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup(void)
{
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  sensors.begin();
}
void loop(void)
{
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  delay(1500);
  float tempC = sensors.getTempCByIndex(0);

  // Check if reading was successful
  if (tempC != DEVICE_DISCONNECTED_C)
  {
    Serial.print("Temperature for the device 1 (index 0) is: ");
    Serial.println(tempC);
  }
  else
  {
    Serial.println("Error: Could not read temperature data");
  }
}

Stepper Motor (ULN200AN)

Simple Code

ESP32 ULN2003AN Sample Code
// Define pins
#define IN1 4
#define IN2 5
#define IN3 18
#define IN4 19

// Stepper sequence (full-step)
byte stepSequence[4] = {
  B1000,  // IN1 activated
  B0100,  // IN2 activated
  B0010,  // IN3 activated
  B0001   // IN4 activated
};

void setup() {
  // Set all pins as outputs
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
}

void loop() {
  // Rotate clockwise
  for(int i = 0; i < 512; i++) {  // 512 steps = ~1 revolution for 28BYJ-48
    for(int j = 0; j < 4; j++) {
      digitalWrite(IN1, stepSequence[j] & B1000);
      digitalWrite(IN2, stepSequence[j] & B0100);
      digitalWrite(IN3, stepSequence[j] & B0010);
      digitalWrite(IN4, stepSequence[j] & B0001);
      delay(3);  // Adjust for speed
    }
  }
  
  delay(1000);  // Pause between rotations
}

Full Code For The System

Simple Code

Fish Feeding Full System Code
#include <OneWire.h>
#include <DallasTemperature.h>

// Stepper motor pins
#define IN1 4
#define IN2 5
#define IN3 18
#define IN4 19

// Temperature sensor pin
#define ONE_WIRE_BUS 2

// Stepper sequence (full-step)
byte stepSequence[4] = {
  B1000,  // IN1 activated
  B0100,  // IN2 activated
  B0010,  // IN3 activated
  B0001   // IN4 activated
};

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// Function to rotate the stepper motor (now defined before loop())
void rotateStepper(int steps, int stepDelay, bool reverse = false) {
  int direction = reverse ? -1 : 1;
  int start = reverse ? 3 : 0;
  int end = reverse ? -1 : 4;
  
  for(int i = 0; i < steps; i++) {
    for(int j = start; j != end; j += direction) {
      digitalWrite(IN1, stepSequence[j] & B1000);
      digitalWrite(IN2, stepSequence[j] & B0100);
      digitalWrite(IN3, stepSequence[j] & B0010);
      digitalWrite(IN4, stepSequence[j] & B0001);
      delay(stepDelay);
    }
  }
}

void setup() {
  Serial.begin(9600);
  Serial.println("Stepper Motor with Temperature Control");
  
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  
  sensors.begin();
}

void loop() {
  sensors.requestTemperatures();
  float tempC = sensors.getTempCByIndex(0);
  
  if (tempC != DEVICE_DISCONNECTED_C) {
    Serial.print("Temperature: ");
    Serial.print(tempC);
    Serial.println("°C");
    
    if (tempC > 25.0) {
      Serial.println("Temperature high - rotating stepper 180° forward");
      rotateStepper(256, 4);  // 256 steps ≈ 180° (half revolution)
      delay(2000);           // Hold for 2 seconds
      Serial.println("Returning to original position");
      rotateStepper(256, 4, true);  // Reverse direction
    } else {
      Serial.println("Temperature normal - no action");
    }
  } else {
    Serial.println("Error: Could not read temperature data");
  }
  
  delay(2000);  // Wait 2 seconds between readings
}

Full Code For The Serevr System

Simple Code

Fish Feeding Full Server System Code
#include <WiFi.h>
#include <WebServer.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// WiFi credentials
const char* ssid = "TCL 30E";
const char* password = "bawantha";

// Temperature sensor setup
#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// Stepper motor pins
#define IN1 12
#define IN2 14
#define IN3 27
#define IN4 26

// Web server on port 80
WebServer server(80);

// Stepper sequence
byte stepSequence[4] = {
  B1000, B0100, B0010, B0001
};

// System variables
float currentTemp = 0;
String motorStatus = "idle";

void rotateStepper(int steps, int stepDelay, bool reverse = false) {
  motorStatus = "rotating";
  int direction = reverse ? -1 : 1;
  int start = reverse ? 3 : 0;
  int end = reverse ? -1 : 4;
  
  for(int i = 0; i < steps; i++) {
    for(int j = start; j != end; j += direction) {
      digitalWrite(IN1, stepSequence[j] & B1000);
      digitalWrite(IN2, stepSequence[j] & B0100);
      digitalWrite(IN3, stepSequence[j] & B0010);
      digitalWrite(IN4, stepSequence[j] & B0001);
      delay(stepDelay);
    }
  }
  motorStatus = "idle";
}

void handleRoot() {
  File file = SPIFFS.open("/index.html", "r");
  if (!file) {
    server.send(500, "text/plain", "Failed to open HTML file");
    return;
  }

void handleRotate() {
  server.send(200, "text/plain", "Rotating motor");
  rotateStepper(256, 4);  // Forward
  delay(1000);
  rotateStepper(256, 4, true);  // Reverse
}

void handleData() {
  String json = "{\"temperature\":" + String(currentTemp) + ",";
  json += "\"motor_status\":\"" + motorStatus + "\"}";
  server.send(200, "application/json", json);
}

void setup() {
  Serial.begin(115200);
  
  // Initialize stepper pins
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  
  // Start temperature sensor
  sensors.begin();
  
  // Connect to WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  
  // Set up server routes
  server.on("/", handleRoot);
  server.on("/rotate", handleRotate);
  server.on("/data", handleData);
  
  server.begin();
}

void loop() {
  server.handleClient();
  
  // Update temperature every 5 seconds
  static unsigned long lastTempUpdate = 0;
  if (millis() - lastTempUpdate > 5000) {
    sensors.requestTemperatures();
    currentTemp = sensors.getTempCByIndex(0);
    lastTempUpdate = millis();
    Serial.println("Temperature: " + String(currentTemp) + "°C");
  }
}

Made by Group 05