Lukas4186

Arduino Fan Control

Jun 28th, 2014
205
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 9 // bei Bedarf Anpassen, je nachdem welchen Pin du benutzt
  15.     #define INTERRUPT_GELB 8  // 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 = 100;
  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.clear();
  103.      
  104.         lcd.setCursor(0 ,0);
  105.         lcd.print("RPM: ");
  106.         lcd.write(rpm);
  107.      
  108.         lcd.setCursor(0 ,1);
  109.         lcd.print("Mode: ");
  110.         lcd.write(userRPM);
  111.      
  112.         // Counter zuruecksetzen
  113.         counter_rpm = 0;
  114.      
  115.         // Zeitpunkt setzen
  116.         letzte_ausgabe = millis();
  117.      
  118.         // Interrupt wieder aktivieren
  119.         attachInterrupt(0, rpm_fan, FALLING);
  120.       }
  121.     }
  122.      
  123.     int key_check(){
  124.       if(digitalRead(lowKey) == 1 || digitalRead(highKey) == 1) // Gibt 1 zurück wenn Taste A ODER Taste B gedrückt wird
  125.         return 1;
  126.       else
  127.         return 0;
  128.     }
  129.      
  130.     int key_rpm(){
  131.       if(digitalRead(highKey) == 1 && userRPM <= 9){  // Wenn Taste highKey gedrückt wird, Drezahl um 1 erhöhen
  132.         userRPM = userRPM + 1;
  133.       }
  134.       if(digitalRead(lowKey) == 1 && userRPM >= 0){ // Wenn Taste lowKey gedrückt wird, Drezahl um 1 verringern
  135.         userRPM = userRPM - 1;
  136.       }
  137.       delay (200); //Widerholungsrate beim dauerhaften drücken des Tasters
  138.       return userRPM;
  139.     }
  140.      
  141.     // Interrupt zaehlt den RPM-Counter hoch
  142.     void rpm_fan(){
  143.       counter_rpm++;
  144.     }
Advertisement
Add Comment
Please, Sign In to add comment