Skocz do zawartości
Komentator

Kurs Arduino - #4 - Przetwornik ADC

Pomocna odpowiedź

PatrykOSK, wróćmy do mojego działającego przykładu, z części 3 tego kursu. Przeanalizuj, co i gdzie jest ustawiane oraz jaki jest warunek pętli:

void loop() {

 if (digitalRead(czujnikOkna) == LOW) { //Jeśli przycisk jest wciśnięty
   digitalWrite(diodaZielona, HIGH); //Włączenie diody zielonej
   digitalWrite(diodaCzerwona, LOW); //Wyłączenie diody czerwonej
 } else { //Jeśli przycisk nie jest wciśnięty
   digitalWrite(diodaZielona, LOW); //Wyłączenie diody zielonej
   digitalWrite(diodaCzerwona, HIGH); //Włączenie diody czerwonej
   Serial.println("Uwaga! Alarm! Okno nie jest zamkniete!");

   while (digitalRead(czujnikOkna) == HIGH) {
     //Zatrzymuyjemy się w pustej pętli do ponownego zamknięcia okna
     delay(25); //W pętli wprowadzamy małe opóźnienie 25ms, aby niwelować zakłócenia
   }

 }
}

Spróbuj dostosować go do swoich potrzeb. Inaczej zabrniemy już chyba zbyt daleko od celu 😉

Udostępnij ten post


Link to post
Share on other sites

Ehhh... już powoli chyba zaczynam się w tym gubić :/ Z Twojego przykładu jasno wszystko wynika i bez problemu go rozumiem ale nie wiem czego bym mógł użyć u siebie jako warunku w pętli while.

Udostępnij ten post


Link to post
Share on other sites

PatrykOSK, no to na spokojnie, a od czego u siebie chcesz uzależnić ponowne wysłanie komunikatu?

Udostępnij ten post


Link to post
Share on other sites

Jedyne co mi przychodzi do głowy to przykład z diodą który tu dawałem,ale okazał się błędny

ewentualnie jakaś dodatkowa zmienna mogła by mi pomóc.

Udostępnij ten post


Link to post
Share on other sites

Może to Cie nakieruje, pisane w pseudokodzie (jedna z metod):

  if (odczytanaWartosc < prog) {
    Włącz diodę;

	 (Czy wysłano == 0 ?) {
		wyślij komunikat;
		wysłano = 1;	
	 }

 } else { 
    wyłacz diodę;   
	 wysłano = 0;
 } 

Udostępnij ten post


Link to post
Share on other sites
int odczytanaWartosc = 0; //Zmienna do przechowywania odczytu ADC 
int prog = 0; //Próg włączenia światła - ustawiany potencjometrem 
float napiecie = 0; 
int wyslano = 0; 
void setup() { 
 pinMode(8, OUTPUT); //Konfiguracja wyjść pod diodę LED 
 Serial.begin(9600); 
} 

void loop() { 
 odczytanaWartosc = analogRead(A5);//Odczytanie wartości z ADC 
 prog = analogRead(A4);//Odczytanie wartości z ADC  
 napiecie = odczytanaWartosc * (5.0/1023.0); //Przeliczenie wartości na napięcie 

 if (odczytanaWartosc < prog) { //Czy jest ciemniej od ustawionego progu? 
    digitalWrite(8, HIGH);//Włączenie diody 
     if (wyslano == 0)
   Serial.println(napiecie); 
   wyslano=1;
 } else { 
    digitalWrite(8, LOW);//Wyłączenie diody 
    wyslano=0; 
 } 


   } 

Treker, W końcu się udało... już myślałem że nie podołam 🙂 Nie wiem dlaczego uparłem się n pętle while skoro można to było rozwazać poprostu dodatkowym if'em..

Mógłbyś mi jeszcze wytłumaczyć (ew. podać link) czym różni się "=" od "==" ?.

Biore się za kolejne zad.dom. może nie pójdzie tak topornie 😃

Udostępnij ten post


Link to post
Share on other sites

PatrykOSK, cieszę się, że teraz działa. Jeśli chodzi o znaki równości, to sprawdź artykuł wskazany przez Mechano. Moja uwaga, co do kodu jest jeszcze taka, abyś dodał nawiasy klamrowe przy tym nowym if'ie. Nie są one niezbędne, ale dopiszesz coś później, zapomnisz o ich dodaniu i będą niepotrzebne problemy. Z nawiasami jest lepsza czytelność kodu 🙂

Udostępnij ten post


Link to post
Share on other sites

Przy dłuższych kodach, wyskakuje mi coś takiego.

Ktoś wie o co chodzi, nie chce się kompilować.

Udostępnij ten post


Link to post
Share on other sites

qbeczek, co to znaczy dłuższy kod? Kiedy dokładnie to wyskakuje?

Próbowałeś reinstalować środowisko?

Udostępnij ten post


Link to post
Share on other sites

Właściwie to nie wiem skąd się to bierze juz, na pocztaku wyskakiwalo powyzej 50 linijek kodu, a teraz dalo rade, czasami wyskakuje jeszcze przy funkcji delay, jak jej nie ma jest ok, wpisze cos i pada.

[ Dodano: 24-01-2016, 21:04 ]

#define przycisk 8
#define czerwona 9
#define zolta 10
#define zielona 11

int odczyt = 0;
String podanaliczba = "";
int podanaliczba_int = 0;
int proby = 3;
int nowakolejka = 0;


void setup() {
 Serial.begin(9600);
 pinMode(przycisk, INPUT_PULLUP);
 pinMode(czerwona, OUTPUT);
 pinMode(zolta, OUTPUT);
 pinMode(zielona, OUTPUT);

 digitalWrite(czerwona, LOW);
 digitalWrite(zolta, LOW);
 digitalWrite(zielona, LOW);

}

void loop() {
 if(nowakolejka == 0){
   Serial.println("Witaj w mojej grze");
   Serial.println("zgadnij jaka jest wartosc odczytana przez procesor");
   Serial.println("masz 3 proby, granica bledu +-200\n powdodzenia");
   Serial.println("Przekrec potencjometr i wcsinij przycisk");
  ++nowakolejka;}


 else{
    if(digitalRead(przycisk) == LOW){
   Serial.println("Zaczynamy!");  
   Serial.println("podaj liczbe od 1 do 1021:");
   while (digitalRead(przycisk) == LOW){delay(25);}
 }
      if(Serial.available()>0){
        odczyt = analogRead(A5);
        podanaliczba = Serial.readStringUntil('\n'); 
        podanaliczba_int=podanaliczba.toInt(); 
        Serial.println("twoja liczba TO:");
        Serial.println(podanaliczba_int);

        if(odczyt-200<=podanaliczba_int && odczyt+200>=podanaliczba_int){
          digitalWrite(zielona, HIGH);
          digitalWrite(zolta, LOW);
          digitalWrite(czerwona, LOW);
          Serial.println("Brawo wygraleś");
          Serial.println("Wcisnij przycisk RESET, aby zaczac od nowa");
          }
        else{

          proby--;

          digitalWrite(czerwona, LOW);
          digitalWrite(zolta, HIGH);
          digitalWrite(zielona, LOW);

         Serial.println("Nie udalo sie"); 
         Serial.println("pozostaly: "); Serial.println(proby);Serial.println("proby");
           }
           if(proby==0){
           digitalWrite(czerwona, HIGH);
           digitalWrite(zielona, LOW);
           digitalWrite(zolta, LOW);
           Serial.println("Przegrales! Sprobj jeszcze raz!");
           Serial.println("nacisnij RESET");
      }
      }    
}
}

A tak przy okazji, jest ok?

W gre grał moj tata, wiec zrobilem +-200 pkt 😃

Udostępnij ten post


Link to post
Share on other sites

qbeczek, to, że program działa, to częściowy sukces. Pamiętaj o poprawnym formatowaniu kodu oraz komentarzach. W kilku miejscach dość dziwnie umieściłeś nawiasy np. tu:

 ++nowakolejka;} 


 else{ 
    if(digitalRead(przycisk) == LOW){ 

Zapis ten jest mylący, zrób to ładnie, tak jak było w artykułach 🙂

Udostępnij ten post


Link to post
Share on other sites

Mówią, że ile programistów tyle róznych kodów, wiem wszyscy mi mowia, że moje kody są nieczytelne, ale dla mnie są, tak się przyzwyczaiłem 😃

edit

rezcywiscie w niektorcyh miejscach juz sam sie nie lapie

Udostępnij ten post


Link to post
Share on other sites

qbeczek, może i tak. Ale nie widziałem jeszcze kogokolwiek używającego zamykających nawiasów po średniku.

Poza tym wcięcia tutaj:

  else{
    if(digitalRead(przycisk) == LOW){
   Serial.println("Zaczynamy!"); 
   Serial.println("podaj liczbe od 1 do 1021:");
   while (digitalRead(przycisk) == LOW){delay(25);}
 }

Masz chyba losowo.

To formatowanie to jakaś katastrofa, tego się nie da czytać.

Udostępnij ten post


Link to post
Share on other sites

Cześć!

Potrzebuje pomocy do zadania 4.6, otóż nie wiem czy idę w dobrym kierunku... Z góry dzięki za odpowiedź!

int FotorezLewy = 0;
int FotorezPrawy = 0;
float NapiecieLewy = 0;
float NapieciePrawy = 0;

void setup() {
 Serial.begin(9600);

 pinMode(8, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(11, OUTPUT);
 pinMode(12, OUTPUT);

 digitalWrite(8, LOW);
 digitalWrite(9, LOW);
 digitalWrite(10, LOW);
 digitalWrite(11, LOW);
 digitalWrite(12, LOW);


}

void loop() {

 FotorezLewy = analogRead(A4);
 FotorezPrawy = analogRead(A5);

 FotorezLewy = map(FotorezLewy, 0, 1023, 1, 3);
 FotorezPrawy = map(FotorezPrawy, 0, 1023, 1, 3);

 Serial.println(FotorezLewy);
 Serial.println(FotorezPrawy);

 if (NapiecieLewy == 2) {
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, HIGH);
  digitalWrite(12, LOW);
} else if (NapiecieLewy == 3) {
   digitalWrite(8, LOW);
   digitalWrite(9, LOW);
   digitalWrite(10, LOW);
   digitalWrite(11, LOW);
   digitalWrite(12, HIGH);
 } else if (NapieciePrawy == 2) {
   digitalWrite(8, LOW);
   digitalWrite(9, HIGH);
   digitalWrite(10, LOW);
   digitalWrite(11, LOW);
   digitalWrite(12, LOW);
 } else if (NapieciePrawy == 3) {
   digitalWrite(8, HIGH);
   digitalWrite(9, LOW);
   digitalWrite(10, LOW);
   digitalWrite(11, LOW);
   digitalWrite(12, LOW);
 } else {
   digitalWrite(8, LOW);
   digitalWrite(9, LOW);
   digitalWrite(10, HIGH);
   digitalWrite(11, LOW);
   digitalWrite(12, LOW);
 }
 delay(500);
}

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...