• 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
Zawieszanie się programu czy sprzętu?
#1
Witam. To jest mój pierwszy program na Arduino, o dziwo działa. Oczywiście były pewne problemy ale z pomocą internetu i dedukcji byłem w stanie sobie z nimi poradzić.
Niestety nie mogę sobie dać rady zawieszaniem działania programu. Wygląda to tak, że czasem  po podaniu zasilania program w ogóle nie startuje. Pomaga reset ale normalnie nie mam do niego dostępu bo sterownik jest zamontowany głęboko w aucie.
Podpowiedzcie proszę, czy w programie jest coś dziwnego co może powodować zawieszanie, czy to będzie raczej wina sprzętu lub zasilania.
Program po starcie powinien zaświecić światła dzienne, a w przypadku załączenia pozycyjnych wyłączyć je i umożliwić włączenie przeciwmgielnych. Sekcja miganie() to sygnalizacja potrzeby załączenia świateł mijania.
Jest dużo komentarzy ale to może pozwoli wam na podgląd moich 'eksperymentów' z programem. Np. na początku wyłączyłem cały warunek uzależniający załączenie świateł od pracującego silnika, bo pomiar napięcia się nie sprawdził. Muszę to zrobić przez sygnał '1' -silnik działa.  Na razie w garażu za zimno na przeróbki instalacji.



Kod:
//wersja 2.2   4.01.2017   wyłączony serial , bez alternatora
//wejścia
int pozSw  = 3;
int pmgSw  = 4;
int oswZew  = 2;  //wej analog czujnik światła
int alter  = A0;  //wej analog napięcie

//wyjścia
int dzienneL = 5;
int dzienneP = 6;
int pmg = 8;
int pmgDio = 9;
int ciemnoDio = 10;

int jasnosc = 170;                    //wypełnienie PWM dziennych
int stanPmg = LOW;
int stanPmgSw;
int wczesniej = HIGH;
int i = 0;
int a = 735;                          ////teraz aku =684   alter=768
int d = 0;
long time = 0;
long debounce = 300;                 //do czytania pmgSw

void setup()
{

pinMode(pozSw, INPUT);  //definicja wejść i wyjść
pinMode(pmgSw, INPUT);
pinMode(oswZew, INPUT);
pinMode(dzienneL, OUTPUT);    //PWM dziennych
pinMode(dzienneP, OUTPUT);
pinMode(pmg, OUTPUT);
pinMode(pmgDio, OUTPUT);
pinMode(ciemnoDio, OUTPUT);

gasimy();
digitalWrite(ciemnoDio, LOW);
//Serial.begin(9600);
}

void loop()
{
    //Serial.print("------------------***");
    //Serial.println(analogRead(alter));
 //if (analogRead(alter) > a )
 //if (a == 735)     
  //{
    
     if (d == 0)
     {delay(1000);}
    d = 1;
 if (digitalRead(pozSw) == LOW)   //załączone 
  {
    //Serial.println("mijania");
    digitalWrite(dzienneL, LOW);     
    digitalWrite(dzienneP, LOW);
    bistab();
  }
 else                             //wyłączone
  {
    //Serial.println("dzienne");
    digitalWrite(pmg, LOW);      
    digitalWrite(pmgDio, LOW);
    stanPmg = LOW;
    analogWrite(dzienneL, jasnosc);
    analogWrite(dzienneP, jasnosc);
    ciemno();
  }
 
 // }
 //else                               //silnik wyłączony
   // {
   // gasimy();
   // d = 0;
   // }
}

void bistab()
       {
          stanPmgSw = digitalRead(pmgSw);  
          if(stanPmgSw == LOW && wczesniej == HIGH && millis() - time > debounce)
           {
            if(stanPmg == HIGH)
                {
                stanPmg = LOW;
                //Serial.println("pmg wył");
                }
          else
               {
               stanPmg = HIGH;
               //Serial.println("pmg zał");
               }
          time = millis();
          }
        digitalWrite(pmg, stanPmg);
        digitalWrite(pmgDio, stanPmg);          
        wczesniej == stanPmgSw;
       }

void gasimy()
      {
        digitalWrite(dzienneL, LOW);     
        digitalWrite(dzienneP, LOW);
        digitalWrite(pmg, LOW);         
        digitalWrite(pmgDio, LOW);
        stanPmg = LOW;
      }
    
void ciemno()               //za ciemno na dzienne
  {
        
    if (digitalRead(oswZew) == LOW && digitalRead(pozSw) == HIGH)
      {
      digitalWrite(ciemnoDio, LOW);
      }
    else
    {
     //Serial.println("-----Ciemno-----");
     miganie();
    }
    
  }

void miganie()
{
  i = i+1;
  //Serial.println(i);
  if (i == 800)                         //ciemno między impulsami
  {
    digitalWrite(ciemnoDio, HIGH);
    delay(80);
    digitalWrite(ciemnoDio, LOW);
    delay(80);
    digitalWrite(ciemnoDio, HIGH);
    delay(80);
    digitalWrite(ciemnoDio, LOW);
    delay(80);
    i = 0;
   }
}
 
Odpowiedź
#2
Tak naprawdę to może być wszystko, ale osobiście obstawiłbym sam program.
Może on nie tyle się wiesza, co po prostu wchodzi w jakiś tryb, z którego nie potrafi wyjść, bo nie obsłużyłeś jakiegoś warunku... lub nie wchodzi do określonego trybu, bo czegoś mu brakuje. Możesz opisać zmienne, szczególnie inputy?
Czy masz możliwość podejść z laptopem do samochodu? Mógłbyś dopisać parę linijek do kodu, które będą wysyłać komunikaty na monitor, potem uruchomić całość i na bieżąco monitorować każdą zmianę stanu Arduino. Może okaże się, że po prostu czegoś nie dopatrzyłeś.

Przy okazji, jeśli to Twój pierwszy program, może warto zacząć od czegoś prostszego, nauczyć się na jakichś prostych modelach, a dopiero potem brać za coś użytecznego Smile
 
Odpowiedź
#3
(10-01-2017, 11:17)krn78 napisał(a): Tak naprawdę to może być wszystko, ale osobiście obstawiłbym sam program.
Może on nie tyle się wiesza, co po prostu wchodzi w jakiś tryb, z którego nie potrafi wyjść, bo nie obsłużyłeś jakiegoś warunku... lub nie wchodzi do określonego trybu, bo czegoś mu brakuje. Możesz opisać zmienne, szczególnie inputy?
Czy masz możliwość podejść z laptopem do samochodu? Mógłbyś dopisać parę linijek do kodu, które będą wysyłać komunikaty na monitor, potem uruchomić całość i na bieżąco monitorować każdą zmianę stanu Arduino. Może okaże się, że po prostu czegoś nie dopatrzyłeś.

Przy okazji, jeśli to Twój pierwszy program, może warto zacząć od czegoś prostszego, nauczyć się na jakichś prostych modelach, a dopiero potem brać za coś użytecznego Smile

Heh, co prawda ostatnio programowałem w Pascalu... naście lat temu w technikum, ale ten program nie jest chyba jakiś strasznie zakręcony. Zwłaszcza, że wcześniej miałem ten układ zrobiony na przekaźnikach i ne555 więc logika połączeń wiele się nie zmieniła.
Tutaj tylko pętla bistab() jest ściągnięta z któregoś forum, reszta jest moja.

Testowałem program przez port szeregowy i zawieszał się przed wyświetleniem pierwszej wysłanej w port linii czyli "-------------------***". Przy pisaniu używałem monitora portu, chociażby po to, żeby znać wartość napięcia alternatora. Z resztą widać to po 'wykomentarzowanych'  ( Dodgy ) liniach w programie. Mając układ jeszcze w domu na biurku budowałem go z klocków i testowałem osobno poszczególne pętle. Tak jak piszę, układ nie działa tylko co któreś uruchomienie, zwłaszcza jeśli odpalam auto po krótkiej jeździe. Po długim postoju działa zawsze.


Opis zmiennych:
pozSw - przełącznik świateł pozycyjnych
pmgSw - przełącznik przeciwmgielnych, switch, działa z pętlą bistab(), która zwraca stanPmg czyli czy światła są włączone czy wyłączone.
dzienneL i P -żarówki świateł mijania działające przez PWM jako dzienne
pmg - żarówki przeciwmgielne
pmgDio - dioda świeci jeśli świecą halogeny
ciemnoDio - dioda miga jeśli za ciemno na dzienne
i - przez dodanie do siebie (i=i+1) robi odstęp między mignięciami ciemnoDio. Chciałem uniknąć długiego 'Delay'
d - po to, żeby Delay(1000) był tylko raz na początku programu. Robi on tutaj opóźnienie załączenia żeby nie obciążać akumulatora światłami przy rozruchu.
a - wartość napięcia alternatora. Jak pisałem wcześniej chciałem tym uruchamiać cały program, ale miedzy 12V a 14,2V jest tak mała różnica, że zdarzało się przy spadku obrotów, że światła gasły.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości