.. note:: Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten. **Warum beitreten?** - **Expertenunterstützung**: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams. - **Lernen & Teilen**: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern. - **Exklusive Vorschauen**: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken. - **Spezialrabatte**: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte. - **Festliche Aktionen und Gewinnspiele**: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil. 👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [|link_sf_facebook|] und treten Sie heute bei! .. _3.1.4_c_pi5: 3.1.4 Intelligenter Ventilator ================================== .. note:: .. image:: ../img/mcp3008_and_adc0834.jpg :width: 25% :align: left Abhängig von Ihrer Kit-Version identifizieren Sie bitte, ob Sie **ADC0834** oder **MCP3008** haben, und fahren Sie mit dem entsprechenden Abschnitt fort. Einführung ----------------- In diesem Projekt verwenden wir Motoren, Tasten und Thermistoren, um einen manuellen + automatischen intelligenten Ventilator zu bauen, dessen Windgeschwindigkeit einstellbar ist. Benötigte Komponenten ------------------------------ Für dieses Projekt benötigen wir die folgenden Komponenten. .. image:: ../img/list_Smart_Fan.png :align: center Es ist sicherlich praktisch, ein ganzes Set zu kaufen, hier ist der Link: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Name - ARTIKEL IN DIESEM KIT - LINK * - Raphael Kit - 337 - |link_Raphael_kit| Sie können sie auch einzeln über die untenstehenden Links kaufen. .. list-table:: :widths: 30 20 :header-rows: 1 * - KOMPONENTENBESCHREIBUNG - KAUF-LINK * - :ref:`cpn_gpio_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_resistor` - |link_resistor_buy| * - :ref:`cpn_power_module` - \- * - :ref:`cpn_thermistor` - |link_thermistor_buy| * - :ref:`cpn_l293d` - \- * - :ref:`cpn_adc0834` - \- * - :ref:`cpn_button` - |link_button_buy| * - :ref:`cpn_motor` - |link_motor_buy| Schaltplan ------------------------ ============ ======== ======== === T-Board Name physisch 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 ============ ======== ======== === .. image:: ../img/Schematic_three_one4.png :align: center Experimentelle Verfahren ----------------------------- **Schritt 1:** Bauen Sie den Schaltkreis. .. image:: ../img/image245.png :align: center .. note:: Das Strommodul kann mit dem 9V-Batterieclip im Kit eine 9V-Batterie nutzen. Setzen Sie den Jumper des Strommoduls in die 5V-Busleisten des Breadboards. .. image:: ../img/image118.jpeg :align: center **Schritt 2**: Wechseln Sie in den Ordner mit dem Code. .. raw:: html .. code-block:: cd ~/raphael-kit/c/3.1.4/ **Schritt 3**: Kompilieren. .. raw:: html .. code-block:: gcc 3.1.4_SmartFan.c -lwiringPi -lm **Schritt 4**: Führen Sie die obige ausführbare Datei aus. .. raw:: html .. code-block:: sudo ./a.out Wenn der Code läuft, starten Sie den Ventilator durch Drücken der Taste. Jedes Mal, wenn Sie drücken, wird die Geschwindigkeitsstufe um 1 erhöht oder verringert. Es gibt **5** Geschwindigkeitsstufen: **0~4**. Wenn Sie auf die 4\ :sup:`te` Geschwindigkeitsstufe eingestellt sind und die Taste drücken, stoppt der Ventilator mit einer **0** Windgeschwindigkeit. Wenn die Temperatur um mehr als 2℃ steigt oder fällt, wird die Geschwindigkeit automatisch um 1 Stufe schneller oder langsamer. .. note:: Wenn es nach dem Starten nicht funktioniert oder ein Fehlerhinweis erscheint: \"wiringPi.h: No such file or directory\", beachten Sie bitte :ref:`install_wiringpi_pi5`. Code -------- .. code-block:: c #include #include #include #include typedef unsigned char uchar; typedef unsigned int uint; #define ADC_CS 0 #define ADC_CLK 1 #define ADC_DIO 2 #define MotorPin1 21 #define MotorPin2 22 #define MotorEnable 23 #define BtnPin 3 uchar get_ADC_Result(uint channel) { uchar i; uchar dat1=0, dat2=0; int sel = channel > 1 & 1; int odd = channel & 1; digitalWrite(ADC_CLK, 1); delayMicroseconds(2); digitalWrite(ADC_CLK, 0); delayMicroseconds(2); pinMode(ADC_DIO, OUTPUT); digitalWrite(ADC_CS, 0); // Start bit digitalWrite(ADC_CLK,0); digitalWrite(ADC_DIO,1); delayMicroseconds(2); digitalWrite(ADC_CLK,1); delayMicroseconds(2); //Single End mode digitalWrite(ADC_CLK,0); digitalWrite(ADC_DIO,1); delayMicroseconds(2); digitalWrite(ADC_CLK,1); delayMicroseconds(2); // ODD digitalWrite(ADC_CLK,0); digitalWrite(ADC_DIO,odd); delayMicroseconds(2); digitalWrite(ADC_CLK,1); delayMicroseconds(2); //Select digitalWrite(ADC_CLK,0); digitalWrite(ADC_DIO,sel); delayMicroseconds(2); digitalWrite(ADC_CLK,1); delayMicroseconds(2); digitalWrite(ADC_CLK,0); delayMicroseconds(2); for(i=0;i<8;i++) { digitalWrite(ADC_CLK,1); delayMicroseconds(2); digitalWrite(ADC_CLK,0); delayMicroseconds(2); pinMode(ADC_DIO, INPUT); dat1=dat1<<1 | digitalRead(ADC_DIO); } for(i=0;i<8;i++) { dat2 = dat2 | ((uchar)(digitalRead(ADC_DIO))<=4){ level =4; } digitalWrite(MotorEnable,HIGH); softPwmWrite(MotorPin1, level*25); return level; } void setup(){ if(wiringPiSetup() == -1){ //when initialize wiring failed,print messageto screen printf("setup wiringPi failed !"); return; } softPwmCreate(MotorPin1, 0, 100); softPwmCreate(MotorPin2, 0, 100); pinMode(MotorEnable,OUTPUT); pinMode(BtnPin,INPUT); pinMode(ADC_CS, OUTPUT); pinMode(ADC_CLK, OUTPUT); } 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; } **Code-Erklärung** .. code-block:: c 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; } Temperture() funktioniert, indem es Thermistorwerte, die von ADC0834 gelesen werden, in Temperaturwerte umwandelt. Weitere Einzelheiten finden Sie unter :ref:`2.2.2_c_pi5`. .. code-block:: c 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;     } Diese Funktion steuert die Drehgeschwindigkeit des Motors. Der Bereich des **Level**: **0-4** (Stufe **0** stoppt den arbeitenden Motor). Eine Stufenanpassung steht für eine Änderung der Windgeschwindigkeit um **25%**. .. code-block:: c 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; } Die Funktion **main()** enthält den gesamten Programmvorgang wie gezeigt: 1) Ständiges Auslesen des Tastenzustandes und der aktuellen Temperatur. 2) Jeder Tastendruck erhöht level um **+1** und gleichzeitig wird die Temperatur aktualisiert. Der **Level** bewegt sich im Bereich **1~4**. 3) Solange der Ventilator arbeitet (der Level ist **nicht 0**), wird die Temperatur überwacht. Eine Änderung um **2℃\ +** bewirkt das Hoch- und Heruntersetzen des Levels. 4) Der Motor ändert die Drehgeschwindigkeit entsprechend dem **Level**.