#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#include <Wire.h>
// OLED display dimensions
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// Create display object
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// DHT sensor configuration
#define DHTPIN 16 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE);
// Define pins
#define VOLTAGE_PIN A0 // Analog pin for voltage potentiometer
#define CURRENT_PIN A1 // Analog pin for current potentiometer
#define LED_PIN 15 // LED pin
#define BUTTON_BATTERY 14 // Button for battery control
#define BUTTON_STEPPER 13 // Button for stepper motor control
#define STEP_PIN 18 // Step pin for A4988
#define DIR_PIN 17 // Direction pin for A4988
#define MS1_PIN 19 // MS1 pin for A4988
#define MS2_PIN 20 // MS2 pin for A4988
// Global variables
bool battery_connected = false;
bool stepper_on = false;
void stepMotor(int steps) {
digitalWrite(DIR_PIN, HIGH); // Set direction
for (int i = 0; i < steps; i++) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(500);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(500);
}
}
void setup() {
// Initialize serial communication
Serial.begin(115200);
Serial.println("Starting setup...");
// Initialize pins
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_BATTERY, INPUT_PULLDOWN);
pinMode(BUTTON_STEPPER, INPUT_PULLDOWN);
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(MS1_PIN, OUTPUT);
pinMode(MS2_PIN, OUTPUT);
// Initialize DHT sensor
dht.begin();
Serial.println("DHT22 initialized.");
// Initialize OLED display
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.display();
Serial.println("OLED initialized.");
}
void loop() {
// Read potentiometer values
float voltage = analogRead(VOLTAGE_PIN) * (3.3 / 1023.0);
float current = analogRead(CURRENT_PIN) * (3.3 / 1023.0);
// Read temperature from DHT22
float temperature = dht.readTemperature();
// Battery management
if (digitalRead(BUTTON_BATTERY) == HIGH) {
battery_connected = !battery_connected;
delay(500); // Debounce delay
}
if (battery_connected) {
digitalWrite(LED_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
}
// Stepper motor control for cooling
if (temperature > 30 || digitalRead(BUTTON_STEPPER) == HIGH) {
stepper_on = true;
stepMotor(512); // Rotate 1 revolution for demonstration
} else {
stepper_on = false;
}
// Update OLED display
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print(F("Battery: "));
display.println(battery_connected ? F("On") : F("Off"));
display.print(F("Voltage: "));
display.print(voltage, 2);
display.println(F("V"));
display.print(F("Current: "));
display.print(current, 2);
display.println(F("A"));
display.print(F("Temp: "));
display.print(temperature, 2);
display.println(F("C"));
display.print(F("Cooling: "));
display.println(stepper_on ? F("On") : F("Off"));
display.display();
Serial.print("Battery: ");
Serial.println(battery_connected ? "On" : "Off");
Serial.print("Voltage: ");
Serial.print(voltage, 2);
Serial.println("V");
Serial.print("Current: ");
Serial.print(current, 2);
Serial.println("A");
Serial.print("Temp: ");
Serial.print(temperature, 2);
Serial.println("C");
Serial.print("Cooling: ");
Serial.println(stepper_on ? "On" : "Off");
delay(1000); // Delay before next reading
}