07-11-2020, 01:54
Witam
Jestem w trakcie pisania programu na Arduino Uno który będzie nadzorował pracę trzech wentylatorów i dwóch czujników DHT 22 oraz wskazywał aktualny czas . Dokładnie będzie kontrolował czy żaden z wentylatorów się nie zablokował.
Obroty jednego wentylatora są liczone w ciągu 1 sek. Mając 3 wentylatory mam opóźnienie w przetwarzaniu kodu o 3 sek. Jak przerobić kod żeby w jednej pętli uzyskać obroty z wentylatorów w ciągu 1 sek ?
Oczywiście nie chodzi mi o zmianę wartości "sampleTime" na 333
Raczej żeby jedna pętle "millis" obejmowała wszystkie trzy.
Jestem w trakcie pisania programu na Arduino Uno który będzie nadzorował pracę trzech wentylatorów i dwóch czujników DHT 22 oraz wskazywał aktualny czas . Dokładnie będzie kontrolował czy żaden z wentylatorów się nie zablokował.
Obroty jednego wentylatora są liczone w ciągu 1 sek. Mając 3 wentylatory mam opóźnienie w przetwarzaniu kodu o 3 sek. Jak przerobić kod żeby w jednej pętli uzyskać obroty z wentylatorów w ciągu 1 sek ?
Oczywiście nie chodzi mi o zmianę wartości "sampleTime" na 333
Raczej żeby jedna pętle "millis" obejmowała wszystkie trzy.
Kod:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
const int wen_1 = 11; //wentylator nadmuch
const int wen_2 = 10; //wentylator wyciąg
const int wen_3 = 9; //wentylator okap
const unsigned long sampleTime = 1000;
void setup()
{
pinMode(wen_1, INPUT); //wentylator nadmuch
pinMode(wen_2, INPUT); //wentylator wyciąg
pinMode(wen_3, INPUT); //wentylator okap
lcd.init(); // uruchomienie LCD
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("RPM1: ");
}
void loop()
{
//obroty wentylatora 1 nadmuch
int rpm1 = getRPM1();
displayRPM1(rpm1);
int rpm2 = getRPM2();
displayRPM2(rpm2);
int rpm3 = getRPM3();
displayRPM3(rpm3);
}
float getRPM1()
{
int count = 0;
boolean flag = LOW;
unsigned long currentTime = 0;
unsigned long startTime = millis();
while (currentTime <= sampleTime)
{
if (digitalRead(wen_1) == HIGH)
{
flag = HIGH;
}
if (digitalRead(wen_1) == LOW && flag == HIGH)
{
count++;
flag = LOW;
}
currentTime = millis() - startTime;
}
float count2rpm = int(60000. / float(sampleTime)) * count; //int 6000
return count2rpm;
}
void displayRPM1(int rpm1)
{
lcd.setCursor(2, 2);
lcd.print(" ");
lcd.setCursor(2, 2);
lcd.print(rpm1, DEC);
}
//obroty wentylatora 2 wyciąg
float getRPM2()
{
int count = 0;
boolean flag = LOW;
unsigned long currentTime = 0;
unsigned long startTime = millis();
while (currentTime <= sampleTime)
{
if (digitalRead(wen_2) == HIGH)
{
flag = HIGH;
}
if (digitalRead(wen_2) == LOW && flag == HIGH)
{
count++;
flag = LOW;
}
currentTime = millis() - startTime;
}
float count2rpm = int(60000. / float(sampleTime)) * count;
return count2rpm;
}
void displayRPM2(int rpm2)
{
lcd.setCursor(9, 2);
lcd.print(" ");
lcd.setCursor(9, 2);
lcd.print(rpm2, DEC);
//obroty wentylatora 3 okap
}
float getRPM3()
{
int count = 0;
boolean flag = LOW;
unsigned long currentTime = 0;
unsigned long startTime = millis();
while (currentTime <= sampleTime)
{
if (digitalRead(wen_3) == HIGH)
{
flag = HIGH;
}
if (digitalRead(wen_3) == LOW && flag == HIGH)
{
count++;
flag = LOW;
}
currentTime = millis() - startTime;
}
float count2rpm = int(60000. / float(sampleTime)) * count;
return count2rpm;
}
void displayRPM3(int rpm3)
{
lcd.setCursor(16, 2);
lcd.print(" ");
lcd.setCursor(16, 2);
lcd.print(rpm3, DEC);
}
//koniec wentylatory