PC ventilator
Napsal: 26 kvě 2019, 16:55
				
				nezkousel nekdo tahat informace o otackach z hall senzoru z pc ventilatoru? a zobrazovat na displeji?
			České fórum pro všechny nadšence do Arduina a dalších technologií.
https://forum.hwkitchen.cz/
Kód: Vybrat vše
 Program funguje tak, že meri dobu jedne otacky prerusenim na pinu PIN_IRQ
  a z ni vypocita otacky za minutu. Data take odesila na standardni
  seriovy port pro Serial Monitor.
  *************************************************************************************
  Je velmi dulezite nastavit maximalni mozne otacky zarizeni promennou MAXROTATE,
  protoze to ovlivnuje dobu TimeDebounce.
  **************************************************************************************/
#define MAXROTATE     3000 // maximalni mozne otacky za minutu - nastavit podle zarizeni
#define TIME_TO_SEND  100  // perioda odesilani dat v [ms]
#define PINLED        13   // embeded LED
#define PIN_IRQ 2          // kontakt je na pinu 2
long start;                // promenna pro casove intervaly
int TimeDebounce;          // promenna pro dobu na osetreni prechodnych jevu kontaktu [ms]
long elapsed;              // promenna pro dobu jedne otacky v [ms]
volatile int speedk;       // promena pro otacky/minuta
void setup() {
  attachInterrupt(digitalPinToInterrupt(PIN_IRQ), speedCalc, FALLING);
   Serial.begin(9600);     // seriovy port pro konzolu - Serial monitor
  pinMode(PIN_IRQ, INPUT_PULLUP); // nastaveni pinu pro kontakt
  // urceni doby na osetreni prechodnych jevu kontaktu s ohledem na maximalni otacky
  if (60000 / MAXROTATE > 100)TimeDebounce = 100; else TimeDebounce = 60000 / MAXROTATE;
  start = millis();        // nacteni vychoziho casu
}
/* mereni doby jedne otacky prerusenim od sestupne hrany na PIN_IRQ */
void speedCalc() {
  // podminka osetruje zakmity kontaktu
  if ((millis() - start) > TimeDebounce) {
    //vypocet doby otacky v [ms]
    elapsed = millis() - start;
    //nastaveni pocatku dalsiho casoveho intervalu
    start = millis();
    // vypocet otacek za minutu s ochranou pred delenim nulou
    if (elapsed > 0)speedk = (int)(60000.0 / (float)elapsed);
    else speedk = 0;
  }
}
void loop() {
   // vypis na konzolu
  Serial.print("Otacky : ");
  Serial.println(speedk);
  // urcuje periodu odesilani dat na Serial Monitor
  delay(TIME_TO_SEND);
}