Lukas4186

Arduino Fan Control

Jul 5th, 2014
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.35 KB | None | 0 0
  1.    
  2.  
  3.     /* -------------------------------------------
  4.     /* Befehle:
  5.     /* 0-10 --> Länge des HIGH-Signals in ms*10
  6.     /* Langsam nach schnell: 1,2,3,4,5,6,7,8,9
  7.     /* 0 fuer STOP
  8.      ------------------------------------------- */
  9.      
  10.     // Einbindungen
  11.     #include <LiquidCrystal.h>
  12.      
  13.     // PINs
  14.     #define PIN_BLAU 8 // bei Bedarf Anpassen, je nachdem welchen Pin du benutzt
  15.     #define INTERRUPT_GELB 9  // Es gibt mehrere Interrupt (Int) Pins am Arduino, hier wird Pin2 also Int0 benutzt
  16.     #define UPDATE_ZYKLUS 100 // Jede 10tel Sekunde Ausgabe der Geschwindigkeit. Sollte Klar sein.
  17.     const int ANZAHL_INTERRUPTS = 1; // Anzahl der Interrupts pro Umdrehung (1 oder 2)
  18.     LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Pins mit denen der LCD verbunden ist
  19.     int highKey = 6;   // Taster für langsamere Drehzahl verbunden mit dem digitalen Pin X
  20.     int lowKey = 7;   // Taster für schnellere Drehzahl verbunden mit dem digitalen Pin Y
  21.      
  22.      
  23.     // Variablen
  24.     int counter_rpm = 0;
  25.     int rpm = 0;
  26.     unsigned long letzte_ausgabe = 0;
  27.     char eingabe;
  28.     int dauer_low = 1;
  29.     int dauer_high = 9;
  30.     int baseTime = 10; // Insgesamt 10 ms
  31.     int userRPM = 0; // Diese Drehzahl wird beim einschalten als Standardwert genutzt
  32.      
  33.      
  34.     void setup()
  35.     {
  36.       // Initialisieren
  37.       Serial.begin(9600);
  38.       pinMode(PIN_BLAU, OUTPUT);
  39.       attachInterrupt(INTERRUPT_GELB, rpm_fan, FALLING);
  40.      
  41.       // set up the LCD's number of columns and rows:
  42.       lcd.begin(16, 2);
  43.      
  44.       // Taster als Eingänge definieren
  45.       pinMode(highKey, INPUT);
  46.       pinMode(lowKey, INPUT);
  47.     }
  48.      
  49.     void loop(){
  50.      
  51.       if(dauer_low != 0){
  52.         digitalWrite(PIN_BLAU, LOW);
  53.         delayMicroseconds(dauer_low * 10);
  54.       }
  55.      
  56.       if(dauer_high != 0){
  57.         digitalWrite(PIN_BLAU, HIGH);
  58.         delayMicroseconds(dauer_high * 10);
  59.       }
  60.      
  61.       // Neue Drehzahl über Computer abfragen
  62.       if (Serial.available()){
  63.         eingabe = Serial.read() - 48; // ASCII 0-9 lesen
  64.         userRPM = eingabe;  // System-Vorgabedrehzahl anpassen.
  65.         if(eingabe == 0)
  66.           eingabe = 10;
  67.         else
  68.           eingabe = 10 - eingabe;
  69.      
  70.         dauer_low = eingabe;
  71.         dauer_high = baseTime - eingabe;
  72.         Serial.print("Dauer des HIGH: ");
  73.         Serial.println(dauer_high);
  74.       }
  75.      
  76.       // Neue Drehzahl über Tasten abfragen
  77.       if (key_check() == 1){
  78.         eingabe = key_rpm(); //
  79.         if(eingabe == 0)
  80.           eingabe = 10;
  81.         else
  82.           eingabe = 10 - eingabe;
  83.      
  84.         dauer_low = eingabe;
  85.         dauer_high = baseTime - eingabe;
  86.         Serial.print("Dauer des HIGH: ");
  87.         Serial.println(dauer_high);
  88.       }
  89.      
  90.      
  91.       if (millis() - letzte_ausgabe == UPDATE_ZYKLUS){
  92.         // Interrupt deaktivieren um das rechnen nicht zu unterbrechen.
  93.         detachInterrupt(0);
  94.      
  95.         // RPM errechnen und ausgeben:
  96.         rpm = counter_rpm * (60 / ANZAHL_INTERRUPTS);
  97.         Serial.print("RPM: ");
  98.         Serial.println(rpm);
  99.         Serial.print("Mode: ");
  100.         Serial.println(userRPM);
  101.      
  102.         lcd.setCursor(0 ,0);
  103.         lcd.print("RPM: ");
  104.         lcd.print(rpm, DEC);
  105.      
  106.         lcd.setCursor(0 ,1);
  107.         lcd.print("Mode: ");
  108.         lcd.print(userRPM, DEC);
  109.        
  110.      
  111.         // Counter zuruecksetzen
  112.         counter_rpm = 0;
  113.      
  114.         // Zeitpunkt setzen
  115.         letzte_ausgabe = millis();
  116.      
  117.         // Interrupt wieder aktivieren
  118.         attachInterrupt(INTERRUPT_GELB, rpm_fan, FALLING);
  119.       }
  120.     }
  121.      
  122.     int key_check(){
  123.       if(digitalRead(lowKey) == 1 || digitalRead(highKey) == 1) // Gibt 1 zurück wenn Taste A ODER Taste B gedrückt wird
  124.         return 1;
  125.       else
  126.         return 0;
  127.     }
  128.      
  129.     int key_rpm(){
  130.       if(digitalRead(highKey) == 1 && userRPM <= 9){  // Wenn Taste highKey gedrückt wird, Drezahl um 1 erhöhen
  131.         userRPM = userRPM + 1;
  132.       }
  133.       if(digitalRead(lowKey) == 1 && userRPM >= 1){ // Wenn Taste lowKey gedrückt wird, Drezahl um 1 verringern
  134.         userRPM = userRPM - 1;
  135.       }
  136.       delay (200); //Widerholungsrate beim dauerhaften drücken des Tasters
  137.       return userRPM;
  138.     }
  139.      
  140.     // Interrupt zaehlt den RPM-Counter hoch
  141.     void rpm_fan(){
  142.       counter_rpm++;
  143.     }
Advertisement
Add Comment
Please, Sign In to add comment