Advertisement
arduino-uno

Drehzahlabhängig schalten

Mar 25th, 2017
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.77 KB | None | 0 0
  1. #include <LiquidCrystal.h> // LCD Library einbinden
  2.  
  3. LiquidCrystal mylcd(8, 9, 4, 5, 6, 7); // Display Anschlußpins definieren
  4.  
  5. const int Eingang = 2; // Pin 2 ist Eingang für Sensor
  6.  
  7. const int SchalterVor = 13;
  8. const int SchalterRueck = 10 ;
  9. const int RelaisVor = 3;
  10. const int RelaisRueck = 11;
  11. const int auswertung = 12;
  12.  
  13. int vor;
  14. int rueck;
  15. int rVor;
  16. int rRueck;
  17. int GeschwindigkeitOk;
  18.  
  19. void setup() {
  20. pinMode(Eingang, INPUT); // Eingangspin auf Eingang stellen
  21. digitalWrite(Eingang, HIGH); // und Pullup-Widerstand einschalten
  22.  
  23. mylcd.begin(16, 2); // Display hat 2 Zeilen a 16 Zeichen
  24. mylcd.print("Drehzahlsensor"); // Überschrift ausgeben
  25. attachInterrupt(0, readmicros, RISING ); // Interrupt 0 auf Routine readmillis setzen
  26. // reagiert auf steigende Flanken an Pin 2
  27.  
  28. pinMode(RelaisVor, OUTPUT);
  29. pinMode(SchalterVor, INPUT);
  30. pinMode(RelaisRueck, OUTPUT);
  31. pinMode(SchalterRueck, INPUT);
  32. pinMode(auswertung, INPUT);
  33.  
  34. }
  35. // ein paar variablen definieren
  36. volatile unsigned long dauer=0; // microsekunden seit dem letzten Interrupt
  37. volatile unsigned long last=0; // Zählerwert beim letzten Interrup
  38. long drehzahl; // selbstredend
  39. char buf[17]; // Pufferstring für sprintf
  40. void loop() { //ist die Geschwindigkeit ok, dann soll wenn entweder der Vorwärts- oder der Rückwärtsgang
  41. //drin ist, das jeweilige Relais anziehen. Fällt der jeweilige Schalter für die Fahrtrichtung
  42. //ab, soll auch da jeweilie Relais abfallen.
  43.  
  44.  
  45. if ( drehzahl < 1000 )
  46. {
  47. GeschwindigkeitOk = HIGH;
  48. }
  49. else
  50. {
  51. GeschwindigkeitOk = LOW;
  52. }
  53.  
  54. vor = digitalRead(SchalterVor); // Schalter fürs vorwärtsfahren
  55. if (vor == LOW)
  56. {
  57. digitalWrite (RelaisVor, HIGH); //RelaisVor soll aus sein!!
  58.  
  59. }
  60. if (vor==HIGH && GeschwindigkeitOk==HIGH && rueck!=HIGH)
  61. {
  62. rVor = LOW;
  63. digitalWrite(RelaisVor, rVor); //RelaisVor soll an sein!!
  64. }
  65. rueck = digitalRead(SchalterRueck); // Schalter fürs rückwärtsfahren
  66. if (rueck == LOW)
  67. {
  68. digitalWrite (RelaisRueck, HIGH); //RelaisRueck soll aus sein!!
  69.  
  70. }
  71. if (rueck==HIGH && GeschwindigkeitOk==HIGH && vor!=HIGH)
  72. {
  73. rRueck = LOW;
  74. digitalWrite(RelaisRueck, rRueck); //RelaisRueck soll an sein!!
  75. }
  76. drehzahl = 60000000 / dauer; // Drehzahl ausrechnen und
  77. sprintf(buf, "p/min %4lu ", drehzahl); // als 4stellig formatierte Zahl in den Puffer schreiben
  78. mylcd.setCursor(0, 1); // cursor an den Anfang der 2. Zeile (fängt mit 0 an)
  79. mylcd.print(buf); // Puffer ausgeben
  80. }
  81. void readmicros() { // Interrupt-Routine
  82. detachInterrupt(0); // Interrupt ausschalten damit er uns nicht beißt
  83. unsigned long m = micros(); // Microsekundenzähler auslesen
  84. unsigned long v = m - last; // Differenz zum letzten Durchlauf berechnen
  85. if (v > 5000) { // ignorieren wenn <= 5ms (Kontaktpreller)
  86. dauer = v; // Wert in dauer übernehmen
  87. last = m; // und wieder den letzten Wert merken
  88. }
  89. attachInterrupt(0, readmicros, RISING ); // Interrupt wieder einschalten.
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement