Nota
¡Hola! Bienvenido a la comunidad de entusiastas de SunFounder para Raspberry Pi, Arduino y ESP32 en Facebook. Profundiza en el mundo de Raspberry Pi, Arduino y ESP32 junto con otros entusiastas.
¿Por qué unirte?
Soporte experto: Resuelve problemas posventa 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: Accede a anuncios de nuevos productos y vistas previas exclusivas.
Descuentos especiales: Disfruta de descuentos exclusivos en nuestros productos más recientes.
Promociones y sorteos festivos: Participa en sorteos y promociones durante las festividades.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy mismo.
3.1.4 Ventilador Inteligente
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 curso, usaremos motores, botones y termistores para crear un ventilador inteligente manual y automático, con velocidad de viento ajustable.
Componentes
Diagrama Esquemático
T-Board Name |
physical |
wiringPi |
BCM |
GPIO17 |
Pin 11 |
0 |
17 |
GPIO18 |
Pin 12 |
1 |
18 |
GPIO27 |
Pin 13 |
2 |
27 |
GPIO22 |
Pin 15 |
3 |
22 |
GPIO5 |
Pin 29 |
21 |
5 |
GPIO6 |
Pin 31 |
22 |
6 |
GPIO13 |
Pin 33 |
23 |
13 |
Procedimiento Experimental
Paso 1: Construye el circuito.
Nota
El módulo de alimentación puede utilizar una batería de 9V con el conector de batería de 9V incluido en el kit. Inserta el capuchón del módulo de energía en las tiras de bus de 5V de la protoboard.
Para Usuarios de Lenguaje C
Paso 2: Ingresa en la carpeta del código.
cd ~/davinci-kit-for-raspberry-pi/c/3.1.4/
Paso 3: Compila el código.
gcc 3.1.4_SmartFan.c -lwiringPi -lm
Paso 4: Ejecuta el archivo ejecutable anterior.
sudo ./a.out
Al ejecutar el código, inicia el ventilador presionando el botón. Cada vez que presiones, se ajustará una velocidad hacia arriba o hacia abajo. Hay 5 niveles de velocidad: 0~4. Al establecer el nivel de velocidad en el 4to y presionar el botón, el ventilador dejará de funcionar con velocidad de viento 0.
Nota
Si no funciona después de ejecutarlo o aparece el mensaje de error: "wiringPi.h: No such file or directory", consulta ¿El código en C no funciona?.
Una vez que la temperatura sube o baja más de 2℃, la velocidad se ajusta automáticamente a un nivel más rápido o más lento.
Explicación del Código
int temperture(){
unsigned char analogVal;
double Vr, Rt, temp, cel, Fah;
analogVal = get_ADC_Result(0);
Vr = 5 * (double)(analogVal) / 255;
Rt = 10000 * (double)(Vr) / (5 - (double)(Vr));
temp = 1 / (((log(Rt/10000)) / 3950)+(1 / (273.15 + 25)));
cel = temp - 273.15;
Fah = cel * 1.8 +32;
int t=cel;
return t;
}
La función temperture() convierte los valores del termistor leídos por el ADC0834 en valores de temperatura. Consulta 2.2.2 Thermistor para obtener más detalles.
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;
}
Esta función controla la velocidad de rotación del motor. El rango de nivel es 0-4 (el nivel 0 detiene el motor). Cada ajuste de nivel representa un cambio del 25% en la velocidad del viento.
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;
}
La función main() contiene todo el proceso del programa, como se muestra a continuación:
Leer constantemente el estado del botón y la temperatura actual.
2) Cada pulsación incrementa el nivel en +1 y, al mismo tiempo, se actualiza la temperatura. El nivel varía entre 1~4.
3) Cuando el ventilador está en funcionamiento (el nivel es diferente de 0), se realiza una detección de temperatura. Un cambio de 2℃+ provoca el aumento o disminución del nivel.
El motor ajusta su velocidad de rotación según el nivel.
Para Usuarios de Python
Paso 2: Ingresar en la carpeta del código.
cd ~/davinci-kit-for-raspberry-pi/python
Paso 3: Ejecutar.
sudo python3 3.1.4_SmartFan.py
Al ejecutar el código, inicia el ventilador presionando el botón. Cada vez que presionas, se ajusta un nivel de velocidad hacia arriba o hacia abajo. Hay 5 niveles de velocidad: 0~4. Cuando se ajusta al 4to nivel y se presiona el botón, el ventilador se detiene con velocidad de viento 0.
Una vez que la temperatura sube o baja más de 2℃, la velocidad se ajusta automáticamente a un nivel superior o inferior.
Código
Nota
Puedes Modificar/Restablecer/Copiar/Ejecutar/Detener el código a continuación. Sin embargo, antes de hacerlo, debes dirigirte a la ruta de código fuente, como davinci-kit-for-raspberry-pi/python.
import RPi.GPIO as GPIO
import time
import ADC0834
import math
# Configurar pines
MotorPin1 = 5
MotorPin2 = 6
MotorEnable = 13
BtnPin = 22
def setup():
global p_M1,p_M2
ADC0834.setup()
GPIO.setmode(GPIO.BCM)
GPIO.setup(MotorPin1, GPIO.OUT)
GPIO.setup(MotorPin2, GPIO.OUT)
p_M1=GPIO.PWM(MotorPin1,2000)
p_M2=GPIO.PWM(MotorPin2,2000)
p_M1.start(0)
p_M2.start(0)
GPIO.setup(MotorEnable, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(BtnPin, GPIO.IN)
def temperature():
analogVal = ADC0834.getResult()
Vr = 5 * float(analogVal) / 255
Rt = 10000 * Vr / (5 - Vr)
temp = 1/(((math.log(Rt / 10000)) / 3950) + (1 / (273.15+25)))
Cel = temp - 273.15
Fah = Cel * 1.8 + 32
return Cel
def motor(level):
if level == 0:
GPIO.output(MotorEnable, GPIO.LOW)
return 0
if level>=4:
level = 4
GPIO.output(MotorEnable, GPIO.HIGH)
p_M1.ChangeDutyCycle(level*25)
return level
def main():
lastState=0
level=0
markTemp = temperature()
while True:
currentState =GPIO.input(BtnPin)
currentTemp=temperature()
if currentState == 1 and lastState == 0:
level=(level+1)%5
markTemp = currentTemp
time.sleep(0.5)
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)
def destroy():
GPIO.output(MotorEnable, GPIO.LOW)
p_M1.stop()
p_M2.stop()
GPIO.cleanup()
if __name__ == '__main__':
setup()
try:
main()
except KeyboardInterrupt:
destroy()
Explicación del Código
def temperature():
analogVal = ADC0834.getResult()
Vr = 5 * float(analogVal) / 255
Rt = 10000 * Vr / (5 - Vr)
temp = 1/(((math.log(Rt / 10000)) / 3950) + (1 / (273.15+25)))
Cel = temp - 273.15
Fah = Cel * 1.8 + 32
return Cel
La función temperature() convierte los valores del termistor leídos por ADC0834 en valores de temperatura. Consulte 2.2.2 Thermistor para obtener más detalles.
def motor(level):
if level == 0:
GPIO.output(MotorEnable, GPIO.LOW)
return 0
if level>=4:
level = 4
GPIO.output(MotorEnable, GPIO.HIGH)
p_M1.ChangeDutyCycle(level*25)
return level
Esta función controla la velocidad de rotación del motor. El rango del nivel es 0-4 (nivel 0 detiene el motor). Cada ajuste de nivel representa un cambio de 25% en la velocidad del ventilador.
def main():
lastState=0
level=0
markTemp = temperature()
while True:
currentState =GPIO.input(BtnPin)
currentTemp=temperature()
if currentState == 1 and lastState == 0:
level=(level+1)%5
markTemp = currentTemp
time.sleep(0.5)
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)
La función main() contiene el proceso completo del programa como se muestra:
Leer constantemente el estado del botón y la temperatura actual.
Cada pulsación incrementa el nivel en +1 y al mismo tiempo, se actualiza la temperatura. El nivel varía entre 1~4.
Cuando el ventilador está en funcionamiento (el nivel es diferente de 0), la temperatura se encuentra bajo monitoreo. Un cambio de 2℃+ provoca un aumento o disminución en el nivel.
El motor ajusta su velocidad de rotación según el nivel.
Imagen del Fenómeno