Arduino Polska Forum

Pełna wersja: On/Off w zależności od częstotliwości
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
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?
Ma rozróżniać tylko te 2 stany, czy zapalać tę diodę kiedy jest dokładnie 2.222Hz?
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.
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ć
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ć.
Witam,
Koniecznie należy zmienić typ zmiennej liczba_impulsów.
Pozdrawiam.