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);
}