Нужна помощь, нужно сделать так, чтобы ардуино считал кол-во оборотов в минуту с помощью оптического энкодера, а не просто выдавал значения 1 и 0, помогите, пожалуйста) Код (Text): #define reed 7 int reedVal; void setup() { Serial.begin(9600); } void loop() { reedVal = analogRead(reed); Serial.println(reedVal); delay(10); } пока это все, что у меня есть(
какое колесо будет точно известно только на днях, я думаю, программу можно будет пока без него написать, с произвольными данными, а потом изменить их. В колесе будет только одно отверстие
тебе нужно написать простой счётчик по прерываниям на восходящем фронте. когда прорезь входит в зону светового луча на цифровом пине будет 1 и значение оборотов увеличится на 1.
вот набросал на прерываниях по нисходящему фронту Код (Text): #define PIN 2 //// прерывания на 2 и 3 пинах volatile boolean count = false; int rot = 0; void setup() { pinMode(PIN, INPUT); attachInterrupt(0, isr, FALLING); Serial.begin(9600); } void loop() { Serial.println(rot); } void isr() { if(digitalRead(PIN) == HIGH && count == false) { count = true; } if(digitalRead(PIN) == LOW && count == true) { count = false; rot ++; } }
vvr, тс нужно не количество оборотов, а количество оборотов в минуту, т.е. скорость. Код будет примерно такой: Код (Text): #define PIN 2 //// прерывания на 2 и 3 пинах boolean FirstInt; float Speed1 = 0; //в оборотах в секунду float Speed2 = 0; //в оборотах в минуту long LastMs; void setup() { pinMode(PIN, INPUT); attachInterrupt(0, isr, RISING); FirstInt = true; Serial.begin(9600); } void loop() { Serial.print(Speed1); Serial.print(" "); Serial.println(Speed2); } void isr() { long CurrMs = millis(); if(FirstInt) { FirstInt = false; }else{ Speed1 = 1000/float(CurrMs - LastMs); Speed2 = Speed1 * 60; } LastMs = CurrMs; } По первому вызову прерывания только фиксируем текущие миллисекунды (можно и микросекунды, но думаю, такая точность не понадобится). Во все остальные вызовы вычитаем из текущих миллисекунд сохраненные. Это будет период имульсов в миллисекундах. 1000/float(CurrMs - LastMs) это сокращенное от 1/(float(CurrMs - LastMs)/1000) float(CurrMs - LastMs)/1000 - период имульсов в секундах. Если 1 поделить на это значение, то получится частота в герцах. По Вашему коду, насколько я понимаю, прерывание это и есть фронт сигнала. И если написано attachInterrupt(0, isr, FALLING); то Код (Text): if(digitalRead(PIN) == HIGH && count == false) { count = true; } выполняться никогда не будет. Не? Вообще, в прерываниях, повешанных на дискретный вход опрашивать этот вход не нужно
Для вывода float с десятичной точкой попробуй такой Loop void loop() { Serial.print(Speed1, 3); Serial.print(" "); Serial.println(Speed2, 1); }