Lukas4186

Arduino Fan Control

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