Arduino Mega 2560-Based Viscosity Meter with LCD Display and Optical Encoder
View and Edit Project In Cirkit Designer
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
- Description: A microcontroller board based on the ATmega2560.
- Pins: IOREF, RESET, 3V3, 5V, GND, VIN, A0-A15, D0-D53, AREF, SDA, SCL
16X2 LCD
- Description: A 16x2 character LCD display.
- Pins: VSS, VDD, V0, RS, RW, E, D0-D7, A, K
Optical Encoder Sensor Module
- Description: A sensor module used to measure rotational position or speed.
- Pins: A0, D0, GND, VCC
Resistor
- Description: A 220 Ohm resistor.
- Pins: pin1, pin2
- Properties:
- Resistance: 220 Ohms
DC Motor
- Description: A DC motor.
- Pins: pin 1, pin 2
Wiring Details
Arduino Mega 2560
- 5V: Connected to VDD of 16X2 LCD, VCC of Optical Encoder Sensor Module, and pin1 of Resistor.
- GND: Connected to VSS, V0, RW, and K of 16X2 LCD, GND of Optical Encoder Sensor Module, and pin 2 of DC Motor.
- D2 PWM: Connected to A0 of Optical Encoder Sensor Module.
- D3 PWM: Connected to pin 1 of DC Motor.
- D7 PWM: Connected to RS of 16X2 LCD.
- D8 PWM: Connected to E of 16X2 LCD.
- D9 PWM: Connected to D4 of 16X2 LCD.
- D10 PWM: Connected to D5 of 16X2 LCD.
- D11 PWM: Connected to D6 of 16X2 LCD.
- D12 PWM: Connected to D7 of 16X2 LCD.
16X2 LCD
- VSS: Connected to GND of Arduino Mega 2560.
- VDD: Connected to 5V of Arduino Mega 2560.
- V0: Connected to GND of Arduino Mega 2560.
- RS: Connected to D7 PWM of Arduino Mega 2560.
- RW: Connected to GND of Arduino Mega 2560.
- E: Connected to D8 PWM of Arduino Mega 2560.
- D4: Connected to D9 PWM of Arduino Mega 2560.
- D5: Connected to D10 PWM of Arduino Mega 2560.
- D6: Connected to D11 PWM of Arduino Mega 2560.
- D7: Connected to D12 PWM of Arduino Mega 2560.
- A: Connected to pin2 of Resistor.
- K: Connected to GND of Arduino Mega 2560.
Optical Encoder Sensor Module
- A0: Connected to D2 PWM of Arduino Mega 2560.
- GND: Connected to GND of Arduino Mega 2560.
- VCC: Connected to 5V of Arduino Mega 2560.
Resistor
- pin1: Connected to 5V of Arduino Mega 2560.
- pin2: Connected to A of 16X2 LCD.
DC Motor
- pin 1: Connected to D3 PWM of Arduino Mega 2560.
- pin 2: Connected to GND of Arduino Mega 2560.
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.