Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

Arduino UNO-Based Conveyor Control System with Multiple I2C LCD Displays and Emergency Stop

View and Edit Project In Cirkit DesignerImage of Arduino UNO-Based Conveyor Control System with Multiple I2C LCD Displays and Emergency Stop

Circuit Documentation

Summary

This circuit is designed to control a conveyor system using an Arduino UNO microcontroller. The system includes multiple 16x2 I2C LCD displays, an RTC DS3231 module for real-time clock functionality, an H-bridge motor driver to control a DC motor, and several emergency stop buttons. The Arduino UNO is programmed to manage the conveyor's operation, display real-time data on the LCDs, and handle emergency stop conditions.

Component List

16x2 I2C LCD

Arduino UNO

Emergency STOP

RTC DS3231

H-Bridge Motor Driver (Ponte H)

DC Motor

12V 7Ah Battery

Wiring Details

16x2 I2C LCD

Arduino UNO

Emergency STOP

RTC DS3231

H-Bridge Motor Driver (Ponte H)

DC Motor

12V 7Ah Battery

Code Documentation

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>

// Define constants
#define NUM_POSTS 6
#define CONVEYOR_PIN 13 // Pin to control conveyor motor
#define DEBOUNCE_DELAY 50 // Debounce delay in milliseconds

// Button and LCD pin definitions
const int buttonPins[NUM_POSTS] = {2, 3, 4, 5, 6, 7};
LiquidCrystal_I2C lcds[NUM_POSTS] = {
  LiquidCrystal_I2C(0x27, 16, 2),
  LiquidCrystal_I2C(0x26, 16, 2),
  LiquidCrystal_I2C(0x25, 16, 2),
  LiquidCrystal_I2C(0x24, 16, 2),
  LiquidCrystal_I2C(0x23, 16, 2),
  LiquidCrystal_I2C(0x22, 16, 2)
};

// Variables
RTC_DS3231 rtc;
bool conveyorStopped = false;
unsigned long lastMoveTime = 0;
unsigned long downtimeStart[NUM_POSTS] = {0};
unsigned long totalDowntime[NUM_POSTS] = {0};
bool buttonPressed[NUM_POSTS] = {false};
unsigned long lastDebounceTime[NUM_POSTS] = {0};

void setup() {
  // Initialize serial monitor
  Serial.begin(9600);

  // Initialize conveyor control pin
  pinMode(CONVEYOR_PIN, OUTPUT);
  digitalWrite(CONVEYOR_PIN, LOW); // Start with conveyor off

  // Initialize buttons
  for (int i = 0; i < NUM_POSTS; i++) {
    pinMode(buttonPins[i], INPUT_PULLUP); // Pull-up configuration
  }

  // Initialize LCDs
  for (int i = 0; i < NUM_POSTS; i++) {
    lcds[i].init();
    lcds[i].backlight();
    lcds[i].setCursor(0, 0);
    lcds[i].print("Initializing...");
  }

  // Initialize RTC
  if (!rtc.begin()) {
    Serial.println("RTC not found!");
    while (1);
  }
}

void loop() {
  // Update date and time
  DateTime now = rtc.now();

  // Check buttons and calculate downtime
  conveyorStopped = false;
  for (int i = 0; i < NUM_POSTS; i++) {
    bool isPressed = !digitalRead(buttonPins[i]); // Active low
    if (isPressed != buttonPressed[i]) {
      lastDebounceTime[i] = millis();
    }

    if ((millis() - lastDebounceTime[i]) > DEBOUNCE_DELAY) {
      if (isPressed != buttonPressed[i]) {
        buttonPressed[i] = isPressed;
        if (isPressed) {
          downtimeStart[i] = millis();
        } else {
          totalDowntime[i] += millis() - downtimeStart[i];
        }
      }
    }

    if (buttonPressed[i]) {
      conveyorStopped = true;
    }
  }

  // Control conveyor
  if (conveyorStopped) {
    digitalWrite(CONVEYOR_PIN, LOW); // Stop conveyor
  } else if (millis() - lastMoveTime >= 120000) { // 2 minutes interval
    digitalWrite(CONVEYOR_PIN, HIGH); // Move conveyor
    delay(2000); // Allow conveyor to move briefly
    digitalWrite(CONVEYOR_PIN, LOW);
    lastMoveTime = millis();
  }

  // Update LCDs
  for (int i = 0; i < NUM_POSTS; i++) {
    lcds[i].clear();
    lcds[i].setCursor(0, 0);
    lcds[i].print("Date: ");
    lcds[i].print(now.day(), DEC);
    lcds[i].print("/");
    lcds[i].print(now.month(), DEC);
    lcds[i].print("/");