Nota
¡Hola, bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi & Arduino & ESP32 en Facebook! Sumérgete más en Raspberry Pi, Arduino y ESP32 con otros entusiastas.
¿Por qué unirse?
Soporte experto: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.
Aprende y comparte: Intercambia consejos y tutoriales para mejorar tus habilidades.
Avances exclusivos: Obtén acceso anticipado a nuevos anuncios de productos y adelantos.
Descuentos especiales: Disfruta de descuentos exclusivos en nuestros productos más recientes.
Promociones festivas y sorteos: Participa en sorteos y promociones de temporada.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy mismo.
3.1.4 Ventilador Inteligente (MCP3008)
Nota
Dependiendo de la versión de tu kit, identifica si tienes ADC0834 o MCP3008 y procede con la sección correspondiente.
Introducción
En este proyecto, usaremos motores, botones y termistores para hacer un ventilador inteligente manual + automático cuya velocidad de viento es ajustable.
Componentes requeridos
En este proyecto necesitamos los siguientes componentes.
Es definitivamente conveniente comprar un kit completo, aquí está el enlace:
Nombre |
ARTÍCULOS EN ESTE KIT |
ENLACE |
|---|---|---|
Kit Raphael |
337 |
También puedes comprarlos por separado en los siguientes enlaces.
INTRODUCCIÓN DEL COMPONENTE |
ENLACE DE COMPRA |
|---|---|
- |
|
- |
|
- |
|
Diagrama esquemático
Nombre |
T-Board |
wiringPi |
BCM |
|---|---|---|---|
SPICE0 |
Pin 24 |
10 |
8 |
SPIMOSI |
Pin 19 |
12 |
10 |
SPIMISO |
Pin 21 |
13 |
9 |
SPISCLK |
Pin 23 |
14 |
11 |
GPIO22 |
Pin 15 |
3 |
22 |
GPIO5 |
Pin 29 |
21 |
5 |
GPIO6 |
Pin 31 |
22 |
6 |
GPIO13 |
Pin 33 |
23 |
13 |
Procedimientos experimentales
Paso 1: Construye el circuito.
Nota
El módulo de energía puede usar una batería de 9V con el conector de batería de 9V incluido en el kit. Inserta el puente del módulo de energía en las líneas de bus de 5V de la protoboard.
Paso 2: Ingresa a la carpeta del código.
cd ~/raphael-kit/c/3.1.4-2/
Paso 3: Compila.
gcc 3.1.4_SmartFan.c -o SmartFan -lwiringPi -lm
Paso 4: Ejecuta el archivo compilado.
./SmartFan
Al ejecutar el código, inicia el ventilador presionando el botón. Cada vez que presiones, se ajusta una velocidad hacia arriba o hacia abajo. Hay 5 niveles de velocidad: 0~4. Cuando está en el nivel 4 y presionas el botón, el ventilador se detiene con una velocidad 0.
Cuando la temperatura aumenta o disminuye más de 2℃, la velocidad se ajusta automáticamente un nivel más rápido o más lento.
Nota
Si no funciona después de ejecutarlo, o aparece un mensaje de error: "wiringPi.h: No such file or directory", por favor consulta Instalar y verificar WiringPi.
Código
#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <stdio.h>
#include <softPwm.h>
#include <math.h>
#define SPI_CHANNEL 0
#define SPI_SPEED 1000000
#define MotorPin1 21
#define MotorPin2 22
#define MotorEnable 23
#define BtnPin 3
int read_ADC(int channel)
{
if (channel < 0 || channel > 7) return -1;
unsigned char buffer[3];
buffer[0] = 1; // Bit de inicio
buffer[1] = (8 + channel) << 4; // Modo de un solo extremo y canal
buffer[2] = 0;
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
int result = ((buffer[1] & 3) << 8) | buffer[2];
return result;
}
int temperture()
{
int analogVal = read_ADC(0);
double Vr = 3.3 * analogVal / 1023.0; // Usar 3.3V como Vref
double Rt = 10000.0 * Vr / (3.3 - Vr);
double temp = 1 / (((log(Rt / 10000.0)) / 3950.0) + (1 / (273.15 + 25.0)));
double cel = temp - 273.15;
double Fah = cel * 1.8 + 32;
printf("Celsius: %.2f C Fahrenheit: %.2f F\n", cel, Fah);
return (int)cel;
}
int motor(int level)
{
if (level == 0) {
digitalWrite(MotorEnable, LOW);
return 0;
}
if (level >= 4) {
level = 4;
}
digitalWrite(MotorEnable, HIGH);
softPwmWrite(MotorPin1, level * 25);
return level;
}
void setup()
{
if (wiringPiSetup() == -1) {
printf("¡Falló la configuración de wiringPi!\n");
return;
}
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("¡Falló la configuración SPI!\n");
return;
}
softPwmCreate(MotorPin1, 0, 100);
softPwmCreate(MotorPin2, 0, 100);
pinMode(MotorEnable, OUTPUT);
pinMode(BtnPin, INPUT);
}
int main(void)
{
setup();
int currentState, lastState = 0;
int level = 0;
int currentTemp, markTemp = 0;
while (1) {
currentState = digitalRead(BtnPin);
currentTemp = temperture();
if (currentTemp <= 0) continue;
if (currentState == 1 && lastState == 0) {
level = (level + 1) % 5;
markTemp = currentTemp;
delay(500);
}
lastState = currentState;
if (level != 0) {
if (currentTemp - markTemp <= -2) {
level = level - 1;
markTemp = currentTemp;
}
if (currentTemp - markTemp >= 2) {
level = level + 1;
markTemp = currentTemp;
}
}
level = motor(level);
}
return 0;
}
Explicación del código
int read_ADC(int channel) { ... }
Esta función se usa para leer la entrada analógica desde el MCP3008 en el canal especificado. Envía un comando SPI de 3 bytes y devuelve un valor digital de 10 bits entre 0–1023.
int temperture() { ... }
La función temperture() lee la señal analógica del termistor a través del MCP3008, calcula el voltaje y la resistencia, luego convierte a Celsius y Fahrenheit usando la fórmula del termistor (aproximación de Steinhart–Hart).
int motor(int level) { ... }
Esta función controla la velocidad del ventilador mediante PWM. El nivel varía de 0–4, donde 0 apaga el ventilador y cada nivel aumenta el ciclo de trabajo en un 25%.
void setup() { ... }
La función setup() inicializa WiringPi, configura SPI, inicializa PWM y configura los pines GPIO necesarios para el control del motor y la lectura del botón.
int main(void) { ... }
La función main() contiene el bucle del programa:
Comprueba constantemente el estado del botón y lee la temperatura actual.
Al presionar el botón, el nivel del ventilador aumenta (ciclando 0–4) y se guarda la temperatura de referencia.
Si la temperatura cambia ±2℃, ajusta automáticamente la velocidad del ventilador.
Llama a
motor(level)para actualizar la salida PWM según el nivel actual.