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

Arduino Mega 2560-Based Viscosity Meter with LCD Display and Optical Encoder

View and Edit Project In Cirkit DesignerImage of Arduino Mega 2560-Based Viscosity Meter with LCD Display and Optical Encoder

Circuit Documentation

Summary

This circuit is designed to measure the viscosity of a fluid using an optical encoder sensor module and a DC motor controlled by an Arduino Mega 2560. The measured data is displayed on a 16x2 LCD screen. The Arduino Mega 2560 reads pulses from the optical encoder sensor to calculate the RPM of the motor, which is then used to compute the viscosity of the fluid. The results are displayed on the LCD screen.

Component List

Arduino Mega 2560

16X2 LCD

Optical Encoder Sensor Module

Resistor

DC Motor

Wiring Details

Arduino Mega 2560

16X2 LCD

Optical Encoder Sensor Module

Resistor

DC Motor

Documented Code

#include <LiquidCrystal.h> // Librería para la pantalla LCD

// Configuración de la pantalla LCD (pines RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

// Pines
const int optoPin = 2; // Pin digital conectado al optointerruptor
const int motorPin = 3; // Pin de control del motor

// Variables para medir RPM
volatile int pulseCount = 0; // Contador de pulsos del optointerruptor
unsigned long lastMillis = 0; // Tiempo en milisegundos para el cálculo de RPM

// Variables para el cálculo de viscosidad
float rpm = 0.0;
float viscosity = 0.0;

// Configuración de constantes del sistema
const float K = 0.001; // Constante que depende de las dimensiones del viscosímetro y la configuración
                       // Ajusta K de acuerdo a los parámetros experimentales

// Interrupción para contar pulsos del optointerruptor
void countPulse() {
    pulseCount++;
}

void setup() {
    // Configuración de pines
    pinMode(optoPin, INPUT);
    pinMode(motorPin, OUTPUT);
    
    // Configuración de interrupción en el pin del optointerruptor
    attachInterrupt(digitalPinToInterrupt(optoPin), countPulse, RISING);

    // Configuración de la pantalla LCD
    lcd.begin(16, 2); // LCD de 16x2
    lcd.print("Viscosimetro");
    delay(2000);
    lcd.clear();
}

void loop() {
    // Calcular RPM cada segundo
    if (millis() - lastMillis >= 1000) {
        // Convertir pulsos a RPM
        rpm = pulseCount * 60.0 / 20.0; // Ajusta "20.0" si el disco tiene otro número de ranuras
        pulseCount = 0; // Reiniciar el contador de pulsos
        lastMillis = millis(); // Actualizar el tiempo

        // Calcular viscosidad (esto es un valor aproximado usando una constante K)
        viscosity = K * rpm; // Ajusta K según los experimentos y parámetros del prototipo

        // Mostrar RPM y viscosidad en la pantalla LCD
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("RPM: ");
        lcd.print(rpm);
        lcd.setCursor(0, 1);
        lcd.print("Visc: ");
        lcd.print(viscosity);
        lcd.print(" Pa.s"); // Unidad de viscosidad dinámica (Pascal-segundo)
    }
}

This code initializes the LCD and sets up the pins for the optical encoder sensor and the DC motor. It uses an interrupt to count pulses from the optical encoder sensor, calculates the RPM, and then computes the viscosity using a constant K. The results are displayed on the LCD screen.