Lukas4186

Arduino Fan Control

Jul 5th, 2014
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.41 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 0  // Interrupt 0 == Pin 2  Es gibt mehrere Interrupt (Int) Pins am Arduino, hier wird Pin2 also Int0 benutzt
  16.     #define UPDATE_ZYKLUS 1000 // 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, 9); // 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;
  29.     int dauer_high;
  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(0, 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.       dauer_low = userRPM;
  48.       dauer_high = baseTime - userRPM;
  49.      
  50.     }
  51.      
  52.     void loop(){
  53.      
  54.       if(dauer_low != 0){
  55.         digitalWrite(PIN_BLAU, LOW);
  56.         delayMicroseconds(dauer_low * 10);
  57.       }
  58.      
  59.       if(dauer_high != 0){
  60.         digitalWrite(PIN_BLAU, HIGH);
  61.         delayMicroseconds(dauer_high * 10);
  62.       }
  63.      
  64.       // Neue Drehzahl über Computer abfragen
  65.       if (Serial.available()){
  66.         eingabe = Serial.read() - 48; // ASCII 0-9 lesen
  67.         userRPM = eingabe;  // System-Vorgabedrehzahl anpassen.
  68.         if(eingabe == 0)
  69.           eingabe = 10;
  70.         else
  71.           eingabe = 10 - eingabe;
  72.      
  73.         dauer_low = eingabe;
  74.         dauer_high = baseTime - eingabe;
  75.         Serial.print("Dauer des HIGH: ");
  76.         Serial.println(dauer_high);
  77.       }
  78.      
  79.       // Neue Drehzahl über Tasten abfragen
  80.       if (key_check() == 1){
  81.         eingabe = key_rpm(); //
  82.         if(eingabe == 0)
  83.           eingabe = 10;
  84.         else
  85.           eingabe = 10 - eingabe;
  86.      
  87.         dauer_low = eingabe;
  88.         dauer_high = baseTime - eingabe;
  89.         Serial.print("Dauer des HIGH: ");
  90.         Serial.println(dauer_high);
  91.       }
  92.      
  93.      
  94.       if (millis() - letzte_ausgabe == UPDATE_ZYKLUS){
  95.         // Interrupt deaktivieren um das rechnen nicht zu unterbrechen.
  96.         detachInterrupt(0);
  97.      
  98.         // RPM errechnen und ausgeben:
  99.         rpm = counter_rpm * (60 / ANZAHL_INTERRUPTS);
  100.         Serial.print("RPM: ");
  101.         Serial.println(rpm);
  102.         Serial.print("Mode: ");
  103.         Serial.println(userRPM);
  104.      
  105.         lcd.setCursor(0 ,0);
  106.         lcd.print("RPM: ");
  107.         lcd.print(rpm, DEC);
  108.      
  109.         lcd.setCursor(0 ,1);
  110.         lcd.print("Mode: ");
  111.         lcd.print(userRPM, DEC);
  112.        
  113.      
  114.         // Counter zuruecksetzen
  115.         counter_rpm = 0;
  116.      
  117.         // Zeitpunkt setzen
  118.         letzte_ausgabe = millis();
  119.      
  120.         // Interrupt wieder aktivieren
  121.         attachInterrupt(0, rpm_fan, FALLING);
  122.       }
  123.     }
  124.      
  125.     int key_check(){
  126.       if(digitalRead(lowKey) == 1 || digitalRead(highKey) == 1) // Gibt 1 zurück wenn Taste A ODER Taste B gedrückt wird
  127.         return 1;
  128.       else
  129.         return 0;
  130.     }
  131.      
  132.     int key_rpm(){
  133.       if(digitalRead(highKey) == 1 && userRPM <= 9){  // Wenn Taste highKey gedrückt wird, Drezahl um 1 erhöhen
  134.         userRPM = userRPM + 1;
  135.       }
  136.       if(digitalRead(lowKey) == 1 && userRPM >= 1){ // Wenn Taste lowKey gedrückt wird, Drezahl um 1 verringern
  137.         userRPM = userRPM - 1;
  138.       }
  139.       delay (200); //Widerholungsrate beim dauerhaften drücken des Tasters
  140.       return userRPM;
  141.     }
  142.      
  143.     // Interrupt zaehlt den RPM-Counter hoch
  144.     void rpm_fan(){
  145.       counter_rpm++;
  146.     }
Advertisement
Add Comment
Please, Sign In to add comment