Advertisement
arduino-uno

Drehzahlabhängig schalten mit Display

Mar 27th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.96 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 <= 80) // auf gewünschte drehzahl einstellen,
  46. // bei der noch geschaltet werden darf
  47. {
  48. GeschwindigkeitOk = HIGH;
  49. }
  50. if (drehzahl >= 85)
  51. {
  52. GeschwindigkeitOk = LOW;
  53. }
  54.  
  55. vor = digitalRead(SchalterVor); // Schalter fürs vorwärtsfahren
  56. if (vor == LOW)
  57. {
  58. digitalWrite (RelaisVor, HIGH); // RelaisVor soll aus sein!!
  59.  
  60. }
  61. if (vor==HIGH && GeschwindigkeitOk==HIGH && rueck!=HIGH)
  62. {
  63. rVor = LOW;
  64. digitalWrite(RelaisVor, rVor); // RelaisVor soll an sein!!
  65. }
  66. rueck = digitalRead(SchalterRueck); // Schalter fürs rückwärtsfahren
  67. if (rueck == LOW)
  68. {
  69. digitalWrite (RelaisRueck, HIGH); // RelaisRueck soll aus sein!!
  70.  
  71. }
  72. if (rueck==HIGH && GeschwindigkeitOk==HIGH && vor!=HIGH)
  73. {
  74. rRueck = LOW;
  75. digitalWrite(RelaisRueck, rRueck); //RelaisRueck soll an sein!!
  76. }
  77. drehzahl = 60000000 / 32 / dauer ; // Drehzahl ausrechnen und (32 Zähne)
  78. sprintf(buf, "p/min %4lu ", drehzahl); // als 4stellig formatierte Zahl in den Puffer schreiben
  79. mylcd.setCursor(0, 1); // cursor an den Anfang der 2. Zeile (fängt mit 0 an)
  80. mylcd.print(buf); // Puffer ausgeben
  81. }
  82. void readmicros() { // Interrupt-Routine
  83. detachInterrupt(0); // Interrupt ausschalten damit er uns nicht beißt
  84. unsigned long m = micros(); // Microsekundenzähler auslesen
  85. unsigned long v = m - last; // Differenz zum letzten Durchlauf berechnen
  86. if (v > 5000) { // ignorieren wenn <= 5ms (Kontaktpreller)
  87. dauer = v; // Wert in dauer übernehmen
  88. last = m; // und wieder den letzten Wert merken
  89. }
  90. attachInterrupt(0, readmicros, RISING ); // Interrupt wieder einschalten.
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement