Nota

Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

Perché unirti a noi?

  • Supporto esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra comunità e del nostro team.

  • Impara e condividi: Scambia consigli e tutorial per migliorare le tue competenze.

  • Anteprime esclusive: Ottieni accesso anticipato a nuovi annunci di prodotti e anteprime speciali.

  • Sconti speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni festive e omaggi: Partecipa a concorsi e promozioni durante le festività.

👉 Pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi stesso!

4.1.10 Ventilatore Intelligente

Nota

../_images/mcp3008_and_adc0834.jpg

A seconda della versione del tuo kit, identifica se hai ADC0834 o MCP3008 e procedi con la sezione corrispondente.

Introduzione

In questo progetto, utilizzeremo motori, pulsanti e termistori per creare un ventilatore intelligente manuale + automatico, con velocità del vento regolabile.

Componenti necessari

In questo progetto, avremo bisogno dei seguenti componenti.

../_images/list_Smart_Fan.png

È sicuramente conveniente acquistare un kit completo, ecco il link:

Nome

ELEMENTI IN QUESTO KIT

LINK

Kit Raphael

337

Raphael Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE AI COMPONENTI

LINK PER L’ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Resistore

ACQUISTA

Modulo di Alimentazione

-

Termistore

ACQUISTA

L293D

-

ADC0834

-

Pulsante

ACQUISTA

Motore DC

ACQUISTA

Schema elettrico

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

../_images/Schematic_three_one4.png

Procedure sperimentali

Passo 1: Costruisci il circuito.

../_images/image245.png

Nota

Il modulo di alimentazione può utilizzare una batteria da 9V con la clip per batteria da 9V inclusa nel kit. Inserisci il ponticello del modulo di alimentazione nelle strisce di alimentazione da 5V della breadboard.

../_images/image118.jpeg

Passo 2: Accedi alla cartella del codice.

cd ~/raphael-kit/python

Passo 3: Esegui.

sudo python3 4.1.10_SmartFan.py

Una volta eseguito il codice, avvia il ventilatore premendo il pulsante. Ogni volta che premi, il livello della velocità aumenta o diminuisce di 1. Ci sono 5 livelli di velocità: 0~4. Quando viene impostato al livello 4th e premi nuovamente il pulsante, il ventilatore si ferma con una velocità del vento di 0.

Quando la temperatura aumenta o diminuisce di oltre 2℃, la velocità aumenta o diminuisce automaticamente di 1 livello.

Codice

Nota

Puoi Modificare/Resettare/Copiare/Eseguire/Fermare il codice qui sotto. Ma prima di farlo, devi accedere al percorso del codice sorgente come raphael-kit/python. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l’effetto.

import RPi.GPIO as GPIO
import time
import ADC0834
import math

# Configurazione dei pin
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()

Spiegazione del Codice

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

temperature() funziona convertendo i valori del termistore letti da ADC0834 in valori di temperatura. Consulta 2.2.2 Termistore per ulteriori dettagli.

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

Questa funzione controlla la velocità di rotazione del motore. L’intervallo di level è 0-4 (level 0 ferma il motore). Ogni aumento di livello rappresenta un cambiamento del 25% nella velocità del vento.

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 funzione main() contiene l’intero processo del programma come mostrato:

  1. Leggi costantemente lo stato del pulsante e la temperatura corrente.

  2. Ogni pressione del pulsante aumenta il livello di +1 e contemporaneamente viene aggiornata la temperatura. Il livello varia da 1 a 4.

  3. Quando il ventilatore è in funzione (livello diverso da 0), la temperatura viene monitorata. Un cambiamento di 2℃+ provoca l’aumento o la diminuzione del livello.

  4. Il motore cambia la velocità di rotazione in base al livello.

Immagine del fenomeno

../_images/image246.png