Bonjour à toutes et à tous,
Je bloque ...
Je suis sur un projet d'un fréquencemètre.
Comprenant le code, je bloque sur la structuration de celui ci. Ci joint le code qui à la base ne vient de moi mais d'un radio amateur pour ses besoins perso.
/*
//////////////// Fréquencemètre///////////////////
- Utilise le prédiviseur MB506 FUJITSU
- Les limites de la fréquence d'entrée Arduino et le division par 64
- autorisent un comptage jusqu'à environ 600 Mhz pour cette version.
- Pour mesurer une fréquence supérieure, le facteur de division sera
- de 128 ou 256 (Cf Datasheet).
- la ligne " unsigned long count = FreqCount.read() * 0.64001422;"
- sera modifiée en conséquence: 1.28 ou 2.56
- La valeur 001422 ci-dessus est une valeur d'ajustement.
- Mon site : http://f5mna.free.fr
- Entrée comptage PIN 5 dig.
*/
// comentarii in romaneste de Nicu FLORICA aka niq_ro#include <FreqCount.h> // foloseste libraria dedicata pentru a masura frecventa
#include <LiquidCrystal.h> // foloseste libraria dedicata pentru afisaj LCD gen 1602LiquidCrystal lcd(7, 6, 4, 3, 2, 1); // indica modul de conectare al pinior afisajului la placa Arduino
// LiquidCrystal lcd(RS, E, D4, D5, D6, D7); //se definesc pinii utilizati la afisajul LCD
unsigned long count0, count1, count2, count3, count4, count5; // se definesc variabile de lungime mare de la 0 la 4.294.967.295 (2^32-1)void setup() {
lcd.begin(16, 2); // definire LCD ca 16x2
lcd.setCursor(0, 0); // pozitionare cursor in colt stanga sus
lcd.print (" FREQUENCEMETRE "); // scrie textul
lcd.setCursor(0, 1); // muta cursorul in colj stanga jos
lcd.print ("VOODOO V 1"); // scrie alt text
delay(2000); // asteapta 2 secunde (2000ms)
lcd.clear (); // sterge ecranul
lcd.setCursor(3, 0); // muta cursorul pe colaone 3 de pe randul 0 (randul de sus)
lcd.print("Frequence"); // scrie frecventa
FreqCount.begin(1000); // citeste frecventa timp de 1 secunda (1000ms)}
void loop() { // aici incepe progrsmul care ruleaza in blucla infinita
if (FreqCount.available()) // daca la intrare este semnal
{
unsigned long count = FreqCount.read() * 0.01; // valoare citita la pinul 5 este inmultita cu 0,64. deoarece a fost divizata anterior cu 64// ATENTIE: face asta deoarece nu-i ajung numarul de cifre.. deci "count" e valoarea frecventei impartita la 100
//unsigned long count = FreqCount.read() * 1.28; // GHz // daca divizarea ar fi cu 128
// era asa: if (count < 10000) { (count = 0);} // signaux parasites ! / daca valaorea citita e mai mica de 10000x100=1MHz, insemna ca e zgomot si considera frecventa zero
// eu zic, deoare nu ar masura sub 1MHz
if (count < 1) { (count = 0);} // signaux parasites ! / daca valaorea citita e mai mica de 100x100=10000Hz=10kHz, insemna ca e zgomot si considera frecventa zero/* Calcul du facteur de division.(1.0000222 ci-dessus)
Le quartz de 16 Mhz pilotant Arduino n'est pas précis ni identique pour toutes les platines.
Une correction peut être nécessaire au niveau logiciel. Pour ce faire,
mesurer la fréquence avec un fréquencemetre étalonné.
Puis faire le rapport entre féquence étalon mesurée et fréquence mesurée avec
ce fréquencemetre. Exemple 145000200/145000000 = 1.0000014
Multiplier le facteur de division (exemple 64) par cette valeur
vous obtenez 64.000088. Le facteur de correction devient 0.64000088
donc (count = count * 0.64000088)
*//*
// Affichage GHz si nécessaire
/////////////////////////////// e asa ca nu e bine gandit..
if (count > 999999999) {
count1= (count/100000);
count2 = (count - (count1100000));
count3 = (count2/10);
count4 = ((count2) - count310 );
}
*/// Mhz
///////////////////
// original: if ((count > 999999) and (count < 1000000000)) (count1 = (count /10000));
// eu zic ca:
if ((count > 9999) and (count < 10000000)) (count1 = (count /10000));
{
count1 = (count /10000); // afla partea intreaga a milioanelor, care reprezinta si numarul milioanelor din numar
count2 = (count - (count110000)); // afla valoarea numarului de la mii in jos
count3 = (count2/10); // afla cifrele de mii
count4 = ((count2) - count310 ); // afla valoarea ultimei cifre din variabila "count", care reprezinta cifra sutelor din frecventa masurata
}// < 1 MHz
////////////////////
// nu prea trebuie asta ca e acelasi lucru ca mai sus... deoarece count1=0
// original: if (count < 1000000)
// eu zic asa:
if (count < 10000) // faca frecventa citita e mai mica decat 1MHz (deci valoarea lui "count" < 10000
{
count2 = (count - (count11000)); // valoarea numarului de la mii in jos
count3 = (count2/10); // afla cifrele de la mii
count4 = ((count2) - count310 ); // afla valoarea ultimei cifre din variabila "count"
}
lcd.setCursor(1, 1); // pune cursorul pe randul 1, de jos, si a 3-a coloana
lcd.print (count1); // afiseaza cifrele din milioane
lcd.print ("."); // pune punct
if ((count3 < 100)and (count3 > 9)) (lcd.print ("0")); // daca cifrele din mii sunt de 2 cifre scrie un zero
if (count3 < 10) (lcd.print ("00")); // daca e doar o cifra la mii pune 2 de zero
lcd.print (count3); // afiseaza cifrele din mii
lcd.print ("."); // pune un punct
lcd.print (count4); // afiseaza cifra sutelor din frecventa
lcd.print ("00"); // rotunjeste cu 2 zerouri
lcd.print (" - Hz ");
delay (100); // asteapta 0,1secunde si incepe iar masurarea si calculele}
}
L'objectif est de modifier la gamme de fréquence comme par exemple, jusqu'à 999 Hz , lcd.print (" - Hz"); de 1000 à 1999 Hz
lcd.print(" -KHz");, etc.
De même, est il possible de changer de gamme avec des boutons qui dans le cas ou il y a un dépassement de fréquence sur la gamme choisi avec l'affichage de dépassement " OVER LOAD ", ça c'est pour le fun !!!
Merci de votre aide
Romuald