• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
On/Off w zależności od częstotliwości
#1
Cześć, 

Proszę po raz kolejny o pomoc, mianowicie chodzi o kod który spowoduję włączenie, podanie zadanego napięcia na wyjście PWN tak aby dioda RGB zapaliła się na kolor czerwony lub pomarańczowy w zależności od częstotliwości na wejściu. 

Na zdjęciu "1", może trochę niefortunnym jest pierwsza zależność przy której ma się zapalić dioda na kolor pomarańczowy. 

Na zdjęciu "2", jest wykres przy którym dioda ma się zapalić na kolor czerwony. 

Napięcie jest stałe dla jednego i drugiego przypadku. 

Pomoże ktoś jak ogarnąć kod?


Załączone pliki Miniatury
       
 
Odpowiedź
#2
Ma rozróżniać tylko te 2 stany, czy zapalać tę diodę kiedy jest dokładnie 2.222Hz?
 
Odpowiedź
#3
ma rozróżnić trzy stany:
1. Brak sygnału na wejściu = dioda nie świeci
2. Częstotliwość "1" = dioda świeci na pomarańczowo.
3. Częstotliwość "2" = dioda świeci na czerwono

Częstotliwości nie muszą być rozpoznawane. Chodzi o to żeby wychwycić różnicę i podać na PWMa odpowiednie napięcia odpowiedzialne za konkretny kolor.
 
Odpowiedź
#4
No to zrobiłbym to tak:


Kod:
float liczba_impulsow;
float czestotliwosc;
unsigned long CZAS=1000;
unsigned long CZAS1;
void setup()
{
  pinMode(2, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(2), zbocze, FALLING);
  Serial.begin(250000);
}

void loop()
{
  CZAS1=millis();
  if(CZAS1==CZAS)
  {
    CZAS = CZAS + 1000;
    czestotliwosc = liczba_impulsow;
    liczba_impulsow=0;
  }
  if(czestotliwosc==0)
  {
    //kod dla braku sygnalu
  }
  if(czestotliwosc>0 && czestotliwosc<4)
  {
    //kod dla 2.22Hz
  }
  if(czestotliwosc>=4)
  {
    //kod dla 13 Hz
  }


  
}
void zbocze()
{
  liczba_impulsow++;
}
Kod działa w taki sposób:
Kiedy na pinie 2 wykryte jest zbocze opadające, to wykonuje się funkcja "zbocze", czyli zmienna liczba_impulsow się zwiększa o 1. Częstotliwość to liczba okresów w sekundzie, więc co sekundę liczba_impulsow staje się częstotliwością[Hz], a sama jest zerowana i zaczyna się liczenie od nowa, można by, np ten czas zwiększyć do 2 sekund, a wynik podzielić przez 2 (zwiększyć dokładność) lub zmniejszyć czas, a wynik pomnożyć (zwiększyć częstość odświeżania , ale zmniejszyć dokładność)

Widzę, że tam napięcie nie waha się między 0 a 5V, więc wypadałoby zastosować dzielniki napięcia czy diody, dla pewności, żeby sobie procka nie uszkodzić
 
Odpowiedź
#5
Dzięki,

Czyli coś takiego powinno działać?


Kod:
float liczba_impulsow;
float czestotliwosc;
unsigned long CZAS=1000;
unsigned long CZAS1;
void setup()
{
 pinMode(2, INPUT_PULLUP);
 attachInterrupt(digitalPinToInterrupt(2), zbocze, FALLING);
 Serial.begin(250000);
 pinMode(3, OUTPUT); // Red
 pinMode(5, OUTPUT); // Green
 pinMode(6, OUTPUT); // Blue
 digitalWrite(3,255);
 digitalWrite(6,255);
 digitalWrite(5,255);
}

void loop()
{
 CZAS1=millis();
 if(CZAS1==CZAS)
 {
   CZAS = CZAS + 1000;
   czestotliwosc = liczba_impulsow;
   liczba_impulsow=0;
 }
 if(czestotliwosc==0)
 {
   digitalWrite(3,0); //dioda nie świeci
   digitalWrite(5,0);
   digitalWrite(6,0);
 }
 if(czestotliwosc>0 && czestotliwosc<4)
 {
   digitalWrite(3,255); //dioda pomaranczowa
   digitalWrite(5,165);
   digitalWrite(6,0);
 }
 if(czestotliwosc>=4)
 {
   digitalWrite(3,255); //dioda pomaranczowa
   digitalWrite(5,0);
   digitalWrite(6,0);  
 }

}
void zbocze()
{
 liczba_impulsow++;
}

A porogram będzie odporny na ewentialne zakłucenia? 
Pod diodę podepnę większy rezystor żeby ja zabezpieczyć.
 
Odpowiedź
#6
Witam,
Koniecznie należy zmienić typ zmiennej liczba_impulsów.
Pozdrawiam.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości