Dobra doprowadziłem program do stanu który mnie zadowala. Błąd odczytu to max 50 hz przy 12 kHz. Poniżej zamieszczam kody:
Generator liczb losowych :
Pomiar:
Generator liczb losowych :
Kod:
const int buttonPin = 4;
const int outputPin = 2;
int measurementCount = 0;
unsigned long startTime = 0;
int frequency = 0;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(outputPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
if (digitalRead(buttonPin) == LOW) {
startTime = millis();
measurementCount = 0; /
while (millis() - startTime < 4000) {
if (millis() - startTime < 1000) {
frequency = random(0, 10000); // Zakres od 0 do 12 kHz
delay(30);
} else {
frequency = random(11501, 12001);
delay (30);
}
tone(outputPin, frequency);
Serial.print("Line: ");
Serial.print(measurementCount++);
Serial.print(", Frequency: ");
Serial.println(frequency);
}
noTone(outputPin);
}
measurementCount=0;
delay (30);
}Pomiar:
Kod:
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <FreqCount.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;
float maxVoltage = 0;
int count=0;
int maxCount = 0;
int frequency=0;
int buttonState=0;
int buttonValue= 0;
void setup()
{
Serial.begin(9600);
pinMode (4,INPUT_PULLUP);
pinMode(A1,INPUT); // Ustawnienia pinu A1 jako wejscie
FreqCount.begin(20);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Inicjalizacja wyświetlacza OLED
display.clearDisplay(); //enough basking
setCustomTextSize(2); // Ustawienie rozmiaru czcionki
display.setTextColor(WHITE); // Ustawienie koloru tekstu
display_start();
}
void setCustomTextSize(float size) //Ustawenie niestandardowego rozmiaru dla wyswietlacz
{
display.setTextSize(round(size));
}
void display_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 display_progress()
{
display.clearDisplay ();
display.setCursor(0, 0); // Ustawienie pozycji kursora
display.println("Trwa pomiar"); // Wyświetlenie napisu "U="
display.display();
}
void display_value()
{
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(frequency); // Wyświetlenie wartości czestotliwosci
display.display(); // Wyświetlenie zawartości bufora na ekranie
}
void measurement()
{
voltage =0;
count=0;
maxCount=0;
frequency=0;
unsigned long startTime = millis();
while (millis() - startTime < 3900) // Mierz czas przez 4 sekundy
{
maxVoltage = analogRead(A1);
voltage = maxVoltage * (5.0 / 1023.0); // Obliczenie napięcia
if (FreqCount.available())
{ //if the code if working
count = FreqCount.read(); //create float var called count and populate it with current frequency count
if (count > maxCount) // Znajdź największą zmierzoną wartość
{
maxCount = count;
}
frequency= (maxCount*50);
}
}
}
void loop()
{
buttonState= digitalRead(4);
if (buttonState == LOW && buttonValue==0)
{
display_progress();
measurement ();
buttonValue++;
}
if (buttonState == LOW && buttonValue==1)
{
display_value();
buttonValue--;
}
delay (100);
}
// Przycisk D4
//Wejscie sygnału D5
// SCL A5
// SDA A4
