Witam
Mam zagwozdkę. W programie poniżej wykonuje między innymi pomiar częstotliwości przebiegu prostokątnego za pomocą funkcji PulseIn w zakresie 2kHz do około 12kHz.
Ogólnie chce mierzyć częstotliwość na przepływomierzu masowym powietrza. W momencie kiedy nacisnę przycisk zostaje otwarty elektrozawór który poda powietrze przez 4 sekundy, a więc na przepływomierzu będzie wzrastać częstotliwość. Chce mierzyć częstotliwość i wyciągnąć największą wartość i wyświetlić ją na wyświetlaczu.
Problem jest taki że gdy podaje różne częstotliwości w zakresie od 2 kHz do 12 kHz to na wyświetlaczu potrafi pojawić się wartość np.: 13625 Hz. Chciałbym zbliżyć się jak najbardziej do prawdziwych wartości. Poniżej zamieszczam kody.
Generator różnych częstotliwości:
Kod pomiaru częstotliwości:
Mam zagwozdkę. W programie poniżej wykonuje między innymi pomiar częstotliwości przebiegu prostokątnego za pomocą funkcji PulseIn w zakresie 2kHz do około 12kHz.
Ogólnie chce mierzyć częstotliwość na przepływomierzu masowym powietrza. W momencie kiedy nacisnę przycisk zostaje otwarty elektrozawór który poda powietrze przez 4 sekundy, a więc na przepływomierzu będzie wzrastać częstotliwość. Chce mierzyć częstotliwość i wyciągnąć największą wartość i wyświetlić ją na wyświetlaczu.
Problem jest taki że gdy podaje różne częstotliwości w zakresie od 2 kHz do 12 kHz to na wyświetlaczu potrafi pojawić się wartość np.: 13625 Hz. Chciałbym zbliżyć się jak najbardziej do prawdziwych wartości. Poniżej zamieszczam kody.
Generator różnych częstotliwości:
Kod:
const int buttonPin = 4;
const int outputPin = 6;
int measurementCount = 0;
unsigned long startTime = 0; // Zmienna przechowująca czas rozpoczęcia generowania losowych wartości
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(outputPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
// Sprawdź, czy przycisk został naciśnięty
if (digitalRead(buttonPin) == LOW) {
startTime = millis(); // Zapisz aktualny czas rozpoczęcia generowania
// Generuj losowe wartości przez 4 sekundy
while (millis() - startTime < 4100) {
int frequency = random(2000, 12001); // Zakres od 2 kHz do 12 kHz
//delay(60);
// Zwiększ numer pomiaru przy każdej iteracji
measurementCount++;
// Ustawianie częstotliwości wyjściowej
tone(outputPin, frequency);
// Wypisywanie informacji do monitora szeregowego
Serial.print("Pomiar ");
Serial.print(measurementCount);
Serial.print(": Częstotliwość: ");
Serial.print(frequency);
Serial.println(" Hz");
}
noTone(outputPin);
measurementCount = 0;
}
}
Kod pomiaru częstotliwości:
Kod:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_WIDTH 128 // Wysokośc ekranu w pikselach
#define OLED_HEIGHT 64 // Szerokośc ekranu w pikselach
Adafruit_SSD1306 display(OLED_WIDTH, OLED_HEIGHT);
float voltage = 0;
int maxAnalogValue = 0;
int maxFrequency = 0;
int stanPrzycisku=0;
int zmienna= 0;
int measurementCount = 0;
void setup()
{
Serial.begin(9600);
pinMode (4,INPUT_PULLUP);
pinMode (2,INPUT);
pinMode(A1,INPUT); // Ustawnienia pinu A1 jako wejscie
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Inicjalizacja wyświetlacza OLED
setCustomTextSize(2); // Ustawienie rozmiaru czcionki
display.setTextColor(WHITE); // Ustawienie koloru tekstu
wyswietlanie_start();
}
void setCustomTextSize(float size) //Ustawenie niestandardowego rozmiaru dla wyswietlacz
{
display.setTextSize(round(size));
}
void wyswietlanie_start ()
{
display.clearDisplay (); // Czyszczenie ekranu
display.setCursor(0, 0); // Ustawienie pozycji kursora
display.println("Nacisnij"); // Wyświetlenie napisu "U="
display.setCursor(0, 24); // Ustawienie pozycji kursora
display.println("przycisk"); // Wyświetlenie napisu "U="
display.setCursor(0, 48); // Ustawienie pozycji kursora
display.println("START"); // Wyświetlenie napisu "U="
display.display(); // Wyświetlenie zawartości bufora na ekranie
}
void wyswietlanie_trwa_pomiar()
{
display.clearDisplay ();
display.setCursor(0, 0); // Ustawienie pozycji kursora
display.println("Trwa pomiar"); // Wyświetlenie napisu "U="
display.display();
}
void wyswietlanie_wartosci()
{
display.clearDisplay (); // Czyszczenie ekranu
display.setCursor(0, 0); // Ustawienie pozycji kursora
display.println("U="); // Wyświetlenie napisu "U="
display.setCursor(36, 0); // Ustawienie pozycji kursora
display.println(voltage); // Wyświetlenie wartości napięcia
display.setCursor(0, 34); // Ustawienie pozycji kursora
display.println("f="); // Wyświetlenie napisu "f="
display.setCursor(36, 36); // Ustawienie pozycji kursora
display.print(maxFrequency); // Wyświetlenie wartości czestotliwosci
display.display(); // Wyświetlenie zawartości bufora na ekranie
}
void pomiar()
{
maxFrequency = 0;
voltage =0;
unsigned long startTime = millis();
while (millis() - startTime < 4000) // Mierz czas przez 4 sekundy
{
unsigned long pulseWidthHigh = pulseIn(2, HIGH); // Mierz czas trwania sygnału na pinie cyfrowym D2
delayMicroseconds (5);
unsigned long pulseWidthLow = pulseIn(2, LOW);
delayMicroseconds (5);
maxAnalogValue = analogRead(A1);
int frequency = 1000000 / (pulseWidthHigh + pulseWidthLow ); // Oblicz częstotliwość na podstawie czasu trwania sygnału
voltage = maxAnalogValue * (5.0 / 1023.0); // Obliczenie napięcia
if (frequency > maxFrequency) // Znajdź największą zmierzoną wartość
{
maxFrequency = frequency;
}
measurementCount++;
Serial.print(measurementCount);
Serial.print(": Częstotliwość: ");
Serial.println(frequency);
}
measurementCount = 0;
}
void loop()
{
stanPrzycisku= digitalRead(4);
if (stanPrzycisku == LOW && zmienna==0)
{
wyswietlanie_trwa_pomiar();
pomiar ();
zmienna++;
}
if (stanPrzycisku == LOW && zmienna==1)
{
wyswietlanie_wartosci();
zmienna--;
}
delay (100);
}