Skocz do zawartości

FrSky Taranis X9D PLUS


Ircowiec
 Udostępnij

Rekomendowane odpowiedzi

Zaraz tam obcykany :P:P raptem ze 2 tygodnie się tym bawię... Tyle ze od 20 z góra lat pracuję jako admin linux/unix i programista choć generalnie jak widzę OOP i często gęsto dokumentacje do niego to mi się niedobrze robi. Vide słynna java "jest świetna bo ... działa na wszystkim" ... to tak jak seks analny jest super bo działa na każdym...

 

Krótka analiza tego kodu :

1. Myślałem ze tylko ja pisze niechlujny kod :P

2. Nie bardzo rozumiem co robi Czujnik1 ... czyta potencjometr.  i coś robi w zależności od jego ustawień ale co oprócz tego jest taka linijka :

delay(200);               // przerwa zależna od położenia potencjometru - Jak ona jest zależna od potencjometru ?

 

Wg mnie jest tu coś strasznie narzeźbione w tym kodzie jak rozumiem (z elektroniką to u mnie jest mocno na bakier - wiem ze jest ).

 

Twój opis jak rozumiem mówi ze zrobiłeś dzielnik napięcia żeby obniżyć napięcie z 10,5 do poniżej 5.

Potem czytasz z pina wartość mierzoną i w zależności od tego dostajesz odpowiednie świecenie diód.

 

Pytania pomocnicze :

Mógłbyś podać tu następujące dane :

1. Ile akumulatorów testujesz ?

2. czy na pewno potrzebny CI ten potencjometr który nie wiadomo co robi  - pomyśl ile razy będziesz to ustawiał i przestawiał ? - coś w podobnie do używania niezliczonej ilości złączek kabli w modelu - ja lutuję ile się da im mniej wtyczek tym lepiej.  Tak samo tutaj moim zdaniem lepiej ustawić to w programowo, protestować jaka wartość jest ok zapisać, zapomnieć.

 

Generalnie  ten kod mi się nie podoba. to samo można zrobić w 5ciu linijkach na krzyż. I dodatkowo dołożyć to do mojego kodu powyżej to będziesz miał 2 w jednym.

Odnośnik do komentarza
Udostępnij na innych stronach

Dwa akumulatory 6v polaczone w 12v   czyly jak jeden akumulator 

uporzadkowsny kod :

int diodar = 10;  
int diodab = 11; 
int diodag = 12; 
int potPin = 0;
int czujnik1Pin = 5;
int czujnik2Pin = 6;
 
int pot;    
int Czujnik2;
int Czujnik1;
int przerwa;        
 int buzzer = 8;
 
 unsigned long led_time = millis() + 10000;
 byte led_state = LOW;
void setup() {
  pinMode(diodar, OUTPUT);
    pinMode(diodab, OUTPUT);
    pinMode(diodag, OUTPUT);
    digitalWrite(diodab,HIGH);
    digitalWrite(diodag,HIGH);
    digitalWrite(diodar,HIGH);
    pinMode(buzzer, OUTPUT);
      
       Serial.begin(9600);
       
       pot = analogRead(potPin);
 unsigned long time = millis(); 
 if(pot>697){
    digitalWrite(diodag, LOW);
   delay(8000);
  {
    
    digitalWrite(diodag,HIGH);
 
       }
       } 
}
 
void loop() {
  pot = analogRead(potPin);  
  Czujnik1 = analogRead(czujnik1Pin);
  Czujnik2 = analogRead(czujnik2Pin);
  
 
   
 //wartosc 9,9-627, 10,5v- 727,
 Serial.println(pot);
  
   if(pot>657 && pot<697){
    
 
  digitalWrite(diodar, LOW);
          
  
       }    
 if( pot>697){
    
 
  digitalWrite(diodar, HIGH);}
 
 if(pot<657){
    
 
  digitalWrite(diodar, LOW);
  
  digitalWrite(buzzer,HIGH);
  delay(200);               
  digitalWrite(diodar, HIGH);
  digitalWrite(buzzer,LOW);
  
  delay(200);     }    
 
if (Czujnik1  > 100) {
 digitalWrite(diodab, LOW);
  
  digitalWrite(buzzer,HIGH);
  delay(200);               
  digitalWrite(diodab, HIGH);
  digitalWrite(buzzer,LOW);
  
  delay(200);
}
if ( Czujnik2 > 100) {
 digitalWrite(diodab, LOW);
  
  digitalWrite(buzzer,HIGH);
  delay(200);               
  digitalWrite(diodab, HIGH);
  digitalWrite(buzzer,LOW);
  
  delay(200);
}
}
 
Odnośnik do komentarza
Udostępnij na innych stronach

aaa Jacku co do oświetlenia    to jest trochę skomplikowane  

Power Led 3W

Napięcie pracy: 3,2V - 3,6V

Prąd przewodzenia: 300-750mA

Power Led 3W IR

Napięcie pracy: 1,4V - 1,6V

Prąd przewodzenia: 350-750mA

te diody  pracuja na dwóch przetwornicach DC-DC 

ale oświetlenie nawigacyjne to 12 diód na rezystorach  pod 12v 

i oświetlenie komór to 4 diody na rezystorach na 12v 

skonfigurowane są na dwóch przełącznikach  3 pozycyjnych 

jeden przełącznik  obsługuje  Power led 3w i IR 

drugi przełącznik  diody led  

wszystko  załączane niezależnie  czy na arduino da sie tak to skonfigurować ? 

 

Odnośnik do komentarza
Udostępnij na innych stronach

Generalnei arduino nie pociągnie takich prądów ani 12V napięć.

Ale Mój program daje CI 8 niezaleznych sygnałów 5V (włączone ) 0V wyłączone.

Wszystkie możliwe kombinacje (2^8).

 

 

Łukaszu nadal nie napisałeś co ten program ma robić i co pokazywać ( jak to jest jakby sprawa wtórna), gdyż wcześniejszego wywodu nie zrozumiałem :)

Odnośnik do komentarza
Udostępnij na innych stronach

Jacek  program ma monitorować  stan naładowania akumulatorów, jak napięcie akumulatorów  jest powyżej 10,5v  to zaświeca się zielona dioda i gaśnie po 8 sek  , jeżeli napięcie akumulatora spadnie poniżej 10,5v to zaświeca się czerwona dioda i świeci się cały czas , jeżeli napięcie spadnie jeszcze niżej, poniżej 9,9v czerwona dioda zaczyna  migać  i buzzer zaczyna piszczeć . Oprócz tego  zamontowane są dwa detektory wody które też obsługuje arduino  , po pojawieniu się wody zaczyna migać niebieska dioda i buzzer wyje  i to chyba na tyle  na chwile obecna co robi arduino . Mam nadzieje że teraz zrozumiałeś :)

Odnośnik do komentarza
Udostępnij na innych stronach

Coś tam popełniłem :

// Obydwa czujniki poziomu wody podłaczyć można do jednego wejscia D2
// Jeśli koniecznie chcesz podłączyć je do odzielnych wyjść to naley je podżłaczyć do D2 i D3
// i powielić z inna nazwą funkcję  waterOnBoard np. waterOnBoard_03 i ustawić na niej kolejne przerwanie
// w funkcji init ale to dodatkowo wymaga przeróbki smych funkcji przerwać do sprawdzania krzyżowego.


#define WATER_SIGNAL_IN 2  //Pin for water signal interupt Digital 2
#define BATERY_PIN A0      //PIN to check battery status ANALOG PIN 0


#define BUZZER 8
#define DIODA_R 10
#define DIODA_B 11
#define DIODA_G 12
#define BATTERY_OK 697
#define BATTERY_LOW 657

//*********************************************************************

boolean waterOnBoardVar = false;

//*********************************************************************

void setup() {
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(WATER_SIGNAL_IN), waterOnBoard, CHANGE);
  if (analogRead(BATERY_PIN)  >= BATTERY_OK) {
    digitalWrite(DIODA_G, HIGH);
    delay (8000);
    digitalWrite(DIODA_G, LOW);
  }
}

//**********************************************************************

void loop() {
  int batteryStatus;
  // Stan krytyczny woda w łodce - pozostale parametry sa nie istotne.
  // stąd nie sa sprawdzane bo i po co i tak trzeba ratować łodkę za
  // wszelką cene
  if (waterOnBoardVar) {
    digitalWrite(DIODA_B, LOW);
    digitalWrite(BUZZER, HIGH);
    delay(200);
    digitalWrite(DIODA_B, HIGH);
    digitalWrite(BUZZER, LOW);
    delay(200);
  }
  // Brak wody w łódce sprawdzany jest stan akumulatora.
  else {
    batteryStatus = analogRead(BATERY_PIN);
    Serial.println(batteryStatus);
    if (batteryStatus < BATTERY_LOW) {
      digitalWrite(BUZZER, HIGH);
      digitalWrite(DIODA_R, LOW);
      delay(200);
      digitalWrite(DIODA_R, LOW);
      delay(200);
    } else if (batteryStatus < BATTERY_OK) {
      digitalWrite(DIODA_R, LOW);
      delay (1000);
    } else {
      digitalWrite(DIODA_R, HIGH);
      delay (1000);
    }
  }
}


//**************************************************************************

void waterOnBoard () {
  if (digitalRead(WATER_SIGNAL_IN) == HIGH) {
    waterOnBoardVar = true;
  } else {
    waterOnBoardVar = false;
  }
}

Powinno byc lepiej, sprawdź komentarze.

 

Będziesz musiał ciut inaczej czujniki wody podpiąć .. wg mnie najlepiej do jednego złącza - D2, jeśli koniecznie chcesz do 2ch to nie będzie problemu ale więcej się nie da - Nano ma tylko 2 przerwania.

Odnośnik do komentarza
Udostępnij na innych stronach

Jacku Twój program nie działa  po wgraniu nic się nie dzieje  gdzieś jest błąd w programie

jedna uwaga czujniki wody sa analogowe z programu wyczytałem (jak dobrze zrozumiałem) że jak będzie woda albo z czujnikami coś nie tak cala reszta  jest wyłączana     czujniki maja pierwszeństwo 

Odnośnik do komentarza
Udostępnij na innych stronach

// Obydwa czujniki poziomu wody podłaczyć można do jednego wejscia D2
// Jeśli koniecznie chcesz podłączyć je do odzielnych wyjść to naley je podżłaczyć do D2 i D3
// i powielić z inna nazwą funkcję  waterOnBoard np. waterOnBoard_03 i ustawić na niej kolejne przerwanie
// w funkcji init ale to dodatkowo wymaga przeróbki smych funkcji przerwać do sprawdzania krzyżowego.


#define WATER_SIGNAL_IN 2  //Pin for water signal interupt Digital 2
#define BATERY_PIN A0      //PIN to check battery status ANALOG PIN 0

#define BUZZER 8
#define DIODA_R 10
#define DIODA_B 11
#define DIODA_G 12
#define BATTERY_OK 697
#define BATTERY_LOW 657

//*********************************************************************

boolean waterOnBoardVar = false;

//*********************************************************************

void setup() {
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(WATER_SIGNAL_IN), waterOnBoard, CHANGE);
  if (analogRead(BATERY_PIN)  >= BATTERY_OK) {
    digitalWrite(DIODA_G, HIGH);
    digitalWrite(13, HIGH);  //dodatoko swieci dioda L arduino
    Serial.println("Akku OK");
    delay (8000);
    digitalWrite(13, LOW);//dodatoko gasnie dioda L arduino
    digitalWrite(DIODA_G, LOW);
  }
}

//**********************************************************************

void loop() {
  int batteryStatus;
  // Stan krytyczny woda w łodce - pozostale parametry sa nie istotne.
  // stąd nie sa sprawdzane bo i po co i tak trzeba ratować łodkę za
  // wszelką cene
  if (waterOnBoardVar) {
    Serial.println("WODA  w lodce");
    digitalWrite(13, HIGH);  //dodatoko swieci dioda L arduino
    digitalWrite(DIODA_B, LOW);
    digitalWrite(BUZZER, HIGH);
    delay(200);
    digitalWrite(13, LOW);  //dodatoko gasnie dioda L arduino
    digitalWrite(DIODA_B, HIGH);
    digitalWrite(BUZZER, LOW);
    delay(200);
  }
  // Brak wody w łódce sprawdzany jest stan akumulatora.
  else {
    batteryStatus = analogRead(BATERY_PIN);
    Serial.println(batteryStatus);
    if (batteryStatus < BATTERY_LOW) {
      Serial.println("Battery_LOW");
    digitalWrite(13, HIGH);  //dodatoko swieci dioda L arduino
      digitalWrite(BUZZER, HIGH);
      digitalWrite(DIODA_R, LOW);
      delay(200);
      digitalWrite(13, LOW);  //dodatoko gasnie dioda L arduino
      digitalWrite(DIODA_R, HIGH);
      delay(200);
    } else if (batteryStatus < BATTERY_OK) {
      Serial.println("Battery_MIDDLE");
      digitalWrite(DIODA_R, LOW);
      digitalWrite(13, HIGH);  //dodatoko swieci dioda L arduino
      delay (1000);
    } else {
      digitalWrite(DIODA_R, HIGH);
      digitalWrite(13, LOW);  //dodatoko gasnie dioda L arduino
      Serial.println("Battery_OK");

      delay (1000);
    }
  }
}


//**************************************************************************

void waterOnBoard () {
  if (digitalRead(WATER_SIGNAL_IN) == HIGH) {
    Serial.println("WODA!!!!");
    waterOnBoardVar = true;
  } else {
    waterOnBoardVar = false;
  }
}


Kod działa prawidłowo - testowałem;

Dorzuciłem trochę kodu debugującego + obsluge diody kontrolnej arduino.

 

Podłączenie :

 

Akku  -A0

Czujniki wody - D2 - jeśli są analogowe to powinny dawać bodajże 4.8V żeby na nóżkę wszedł stan WYSOKI. Przerwanie reaguje na zmiane stanu z wysokiego na niski i odwrotnie.

 

Brzęczyk - D8

Dioda R - D10

Dioda B -D11

Dioda G -D12

 

Czy kod działa podłącz konsolę do arduino i pozwieraj kablem wejścia A0 i D2 z 5V.

Na konsoli dostaniesz odczyty tego co robi program.

Jedna uwaga zdziwiłem się ale w Twoim programie było ze diody zapalają się na stan niski na nóżce i tak tez powieliłem teraz.

Odnośnik do komentarza
Udostępnij na innych stronach

Niestety Jacku  ale coś jest nie tak po wgraniu Twojego kodu nic się nie dzieje po wgraniu mojego śmiga , gdzieś jest jakiś błąd 

na konsoli  pokazuje    zmiane stanu akumulatora  ale  nie swiecią RBG nie odzywa się buzzer , czujnik wody  po podanu wilgoci na nie nic się nie dzieje , RBG mają wspólny minus 

Odnośnik do komentarza
Udostępnij na innych stronach

1. czy zmieniłeś podłączenie czujników wilgoci zgodnie z opisem ?

2. Czy przy podaniu wody  daje ok 4.8V ?

3. Jakiego arduino używasz ?

4. Przerwania (czujniki wilgoci ) w arduino nano działają tylko i wyłącznie na D2 i D3 na innych działać nie będą.

 

Program generalnie działa prawidłowo bo dokładnie go testowałem ale bez znajomości podłączeń i hardware niewiele mogę więcej zrobić.

Odnośnik do komentarza
Udostępnij na innych stronach

1. Na razie tylko jeden czujnik  pod D2 

2. Tu trzeba zwiększyć czułość czujników są w takim miejscu że nie mogę je obecnie zalać wodą  i w razie awarii też nie mogę czekać na pełne zalanie tylko wcześnie reagować  (na pośliniony palec podało ok 3v ) 

3. Arduino nano 3.0 atmega328

4. Te czujniki na starym programie  pod A5 i A6 działały bardzo dobrze 

 

Przy włączeniu łódki powinna oświecić się zielona dioda informująca o naładowanym aku , nie oświeca się  zresztą jak żaden inny kolor,

Dla testu zrób może tak aby czujniki nie wyłączały całej reszty   i sprawdzę  jak  pozostałe funkcje będą działać skupimy się na czujnikach 

 
Odnośnik do komentarza
Udostępnij na innych stronach

Jak to są czujniki analogowe to kichach .. nie uruchomią przerwania - ten element trzeba zmienić i cześć.

Działanie programu możesz dokłądnie sprawdzić za pomocą konsoli. wszystkie działania są tam wyświetlane.

Brak sygnały +4,8V na D2 => brak uruchomienia przerwania=> brak blokady programu. Cały czas leci pętla sprawdzająca akumulator.

 

Zwróć uwagę na komunikaty na konsoli + na miganie diody na arduino (D13).

Odnośnik do komentarza
Udostępnij na innych stronach

No to lipa  czujniki są zamontowane  nie będę ich   zmieniał. Jacku prawdę mówiąc    mało istotne co pokazuje konsola  to ma działać w praktyce nie w konsoli a w praktyce lipa , od początku było wiadomo że to czujniki analogowe i były podłączone pod piny analogowe .

Szkoda że Twój skrypt nie wypalił i nie rozwiązał mojego problemu , w moim programie dam podwójne sprawdzanie akumulatora zanim program da sygnał a napięcie spróbuję trochę ustabilizować kondesatorem.

Odnośnik do komentarza
Udostępnij na innych stronach

 Udostępnij

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę.