Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

Cześć;

Chciałbym Was prosić o pomoc z zadaniem 4.5. Z programowaniem nie miałem zbyt wiele doświadczenia. Poprzeglądałem trochę internet i w głowie stworzyła mi się jakaś wizia tego programu, ale wizja nie bardzo działa.

Możecie coś podpowiedzieć? Co powinienem poprawić ewentualnie czy to co stworzyłem zmierza w dobrym kierunku czy lepiej skasować i zacząć od nowa?😂

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

int i=0;
String odczytanaWartosc = ""; //wartosc wpisana przez użytkownika
int odczytanaWartosc_int = 0; //wartosc wpisana przez użytkownika
int wartoscPot = 0; //wartosc odczytana z potencjometru

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

  pinMode(zielona, OUTPUT);
  pinMode(zolta, OUTPUT);
  pinMode(czerwona, OUTPUT);
  pinMode(przycisk,INPUT_PULLUP);
  
  digitalWrite(zielona, LOW);
  digitalWrite(zolta, LOW);
  digitalWrite(czerwona, LOW);
  
}

void loop() {
  if (digitalRead(7) == LOW){ //jeśli przycisk wcisniety
   
    Serial.println("Podaj liczbe:"); 
    
	 for (i=1; i <= 3; i++){ //wykonujemy 3 proby
       
       odczytanaWartosc = Serial.readStringUntil('\n'); // odczyt wartości i zamianan na INT
       odczytanaWartosc_int = odczytanaWartosc.toInt();    
        
       if (Serial.available()>0){ //jeśli wprowadzone dane sa wieksze od 0
              wartoscPot = analogRead(A5); //odczytujemy wartość z potencjometru
            if (odczytanaWartosc_int == wartoscPot || odczytanaWartosc_int <= wartoscPot+50 && odczytanaWartosc_int >= wartoscPot-50){
              digitalWrite(zielona, HIGH);
              digitalWrite(zolta, LOW);
              digitalWrite(czerwona, LOW);
              Serial.println("Gratulacje, wygrales");
              break; //przerywamy for w przypadku trafienia
              
           }else {
              digitalWrite(zielona, LOW);
              digitalWrite(zolta, HIGH);
              digitalWrite(czerwona, LOW);
              Serial.println("Zla liczba");//jeśli dobrz rozumiem wracm na początek pętli for
           }   
          }
         Serial.println("Przegrałes, sprobuj ponownie"); 
      }
  
  }
 }

 

Link do komentarza
Share on other sites

@Maszynyodsrodka, wygląda ładnie, idziesz w dobrym kierunku 😉 Powodzenia w dalszych eksperymentach! W razie problemów możesz zawsze podejrzeć jak z zadaniem poradziły sobie inne osoby (w tym temacie znajdziesz sporo przykładowych programów).

Link do komentarza
Share on other sites

Witam. Rozwiązałem zadanie 4.6 i nawet działa. Jest jednak pewno ale... Wszystko działa tak jak powinno jednak jedna z diod świeci bardzo bardzo słabo, sprawdziłem prąd jakim jest zasilana podczas świecenia i jest to 0,08mA. Rezystory wszędzie jednakowe, skrypt wydaje się ok. W czym może tkwić problem? Zamieszczam nieco chaotyczne zdjęcie połączeń i skrypt. 

#define redLedL 8
#define yellowLedL 9
#define greenLed 10
#define yellowLedR 11
#define redLedR 12

int fotoRez1 = 0;
int fotoRez2 = 0;
byte value = 100;

void setup() {
  pinMode(redLedL, OUTPUT);
  pinMode(yellowLedL, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode(redLedR, OUTPUT);
  pinMode(redLedR, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  fotoRez1 = analogRead(A5);
  fotoRez2 = analogRead(A4);
  
  Serial.print("Fotorezystor 1: ");
  Serial.println(fotoRez1);
  Serial.print("Fotorezystor 2: ");
  Serial.println(fotoRez2);
  
  if (abs(fotoRez1 - fotoRez2) <= 50) {
    digitalWrite(redLedL, LOW);
    digitalWrite(yellowLedL, LOW);
    digitalWrite(greenLed, HIGH);
    digitalWrite(yellowLedR, LOW);
    digitalWrite(redLedR, LOW);
  }
  else if (fotoRez1 > fotoRez2 + value) {
    digitalWrite(redLedL, HIGH);
    digitalWrite(yellowLedL, LOW);
    digitalWrite(greenLed, LOW);
    digitalWrite(yellowLedR, LOW);
    digitalWrite(redLedR, LOW);  
  }
  else if (fotoRez1 > fotoRez2) {
    digitalWrite(redLedL, LOW);
    digitalWrite(yellowLedL, HIGH);
    digitalWrite(greenLed, LOW);
    digitalWrite(yellowLedR, LOW);
    digitalWrite(redLedR, LOW);
  }
    else if (fotoRez2 > fotoRez1) {
    digitalWrite(redLedL, LOW);
    digitalWrite(yellowLedL, LOW);
    digitalWrite(greenLed, LOW);
    digitalWrite(yellowLedR, HIGH);
    digitalWrite(redLedR, LOW);
  }
  else if (fotoRez2 > fotoRez1 + value) {
    digitalWrite(redLedL, LOW);
    digitalWrite(yellowLedL, LOW);
    digitalWrite(greenLed, LOW);
    digitalWrite(yellowLedR, LOW);
    digitalWrite(redLedR, HIGH);
  }
  delay(1000);
}

IMG_20190202_144514384.thumb.jpg.2a274c73939fdd2954735c62f11ee058.jpg

Mowa o prawej żółtej diodzie, pin 11 na Arduino.

Link do komentarza
Share on other sites

@TheProrok29 zostaw podłączenie takie jak masz i wgraj zwykły program, który miga diodą na pinie numer 11. Będziesz wiedział, czy to problem sprzętowy (uszkodzone Arduino, błędne połączenie), czy coś z programem. Daj znać jaki efekt 🙂

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

ZAD 4.5

Nie mam pojęcia dlaczego, przy wpisaniu błędnej odpowiedzi, gdy program po raz drugi prosi użytkownika o podanie liczby, program zachowuje się tak jakbym po raz kolejny wpisał liczbę(tą starą), a za trzecim razem ta sytuacja już nie występuje, ktoś mógłby mi pomóc?

int wartoscADC=0;
int liczba;
int i=0;

void setup() {
  // put your setup code here, to run once:
    pinMode(2,INPUT_PULLUP);
    Serial.begin(9600);
    pinMode(8,OUTPUT);
    pinMode(9,OUTPUT);
    pinMode(10,OUTPUT);

    digitalWrite(8,LOW);
    digitalWrite(9,LOW);
    digitalWrite(10,LOW);
}

void loop() {
  // put your main code here, to run repeatedly:
    
    if(digitalRead(2)==LOW)
    {
      wartoscADC=analogRead(A5);
    }
      if(wartoscADC>0)
      {
        
        Serial.println(liczba);
        
        Serial.println("Podaj liczbe: ");
        

        while(Serial.available()==0){}

        
        
        if(Serial.available()>0)
        {
            liczba=Serial.parseInt();
    
            if(liczba>(wartoscADC-50) && liczba<(wartoscADC+50))
            {
              Serial.println("WYGRALES");
              digitalWrite(8,LOW);
              digitalWrite(9,LOW);
              digitalWrite(10,HIGH);
              while(liczba>(wartoscADC-50) && liczba<(wartoscADC+50)){}
            }
            else
              {
                  i=i+1;
                  if(i<3)
                    {
                      Serial.println("ZLE,ALE MASZ JESZCZE SZANSE: ");
                      Serial.println(3-i);
                      digitalWrite(9,HIGH);
                      delay(2000);
                      digitalWrite(9,LOW);
      
                     }
                  else
                  {
                    digitalWrite(8,HIGH);
                    Serial.println("PRZEGRALES");
                    while(i=3){}
                  }
              }
        }
      }
}

 

Link do komentarza
Share on other sites

Cześć, potrzebuję pomocy bo nie wiem jak zatrzymać program do czasu aż wejdą jakieś dane i chodzi o to by zatrzymywał przy każdym przejściu przez pętle void loop(). To mój kod do zad 4.5 (jeszcze niedokończony).

int podanaWartosc = 2;
int odczytanaWartosc = 0;
void setup() {
pinMode(4, INPUT_PULLUP);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
Serial.begin(9600);
}

void loop() {
  Serial.println("Proszę przekręcić potencjmoter i podać liczbę od 1 do 5");
  while(Serial.available() == 0) {}
  Serial.println(podanaWartosc);
    podanaWartosc = Serial.parseInt();
    Serial.println(podanaWartosc);
while(digitalRead(4) ==  HIGH) {
  odczytanaWartosc = analogRead(A5);
  odczytanaWartosc = map(odczytanaWartosc, 0, 1023, 1, 5);
}
if(podanaWartosc == odczytanaWartosc) {
  digitalWrite(5,HIGH);
  Serial.println("Gratuluję!");
}
}

po pierwszym wpisaniu liczby wszystko jest okej ale potem jak wraca program do początku to przeskakuje pętle while(Serial.available() ==0) {}.

Link do komentarza
Share on other sites

Witam wszystkich na forum, jest to mój pierwszy post. Otóż w poradniku mam problem z zadaniem z fotorezystorem. Na wstępie napiszę, że program na arduino dla pewności wgrałem przekopiowany z kursu. Problem wygląda następująco. W kursie na schemiacie do fotorezystora i rezystora podłączony jest + i - i u mnie taki układ nie działa. Ale po odłączeniu tych przewodów zaczyna działać(po całkowitym zakryciu fotorezystora dioda miga, nie świeci ciągle) . Dlaczego tak się dzieje? Dołączam rysunek. 

 

Zrobiłem wersję z potencjomatrem, działa, ale zbudowałem jeszcze raz tą bez potencjometru i znowu ten sam problem. Wartość przełączania próbowałem też różną.

ard_3_4-650x419.png ard_3_4-650x4191.png

51979937_794764554233755_4749712544900317184_n.jpg 52510858_340333823246303_8893451834794967040_n.jpg

Link do komentarza
Share on other sites

@25pawel, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

Dnia 9.02.2019 o 11:42, 25pawel napisał:

Nie mam pojęcia dlaczego, przy wpisaniu błędnej odpowiedzi, gdy program po raz drugi prosi użytkownika o podanie liczby, program zachowuje się tak jakbym po raz kolejny wpisał liczbę(tą starą), a za trzecim razem ta sytuacja już nie występuje, ktoś mógłby mi pomóc?

To powinno dać Ci do myślenia, że albo nie czyścisz zmiennej lub robisz to w złym momencie. Zacznijmy jednak od czegoś innego. Jak masz ustawiony monitor portu szeregowego? Czy do wysyłanych danych doklejasz jakieś znaki końca linii?

@Karliko to samo pytanie, co wyżej - czy doklejasz do wysyłanych danych jakież znaki końca linii?

@CharlesX, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

Dnia 11.02.2019 o 18:16, CharlesX napisał:

Zrobiłem wersję z potencjomatrem, działa, ale zbudowałem jeszcze raz tą bez potencjometru i znowu ten sam problem. Wartość przełączania próbowałem też różną.

Twoja "działająca" wersja jest na 100% zła, tutaj nie ma co dyskutować. Coś tam działa, bo przypadkiem zbiera jakieś "elektrośmieci" z powietrza. Spójrz jeszcze raz na swój układ i na schemat z kursu. Nie pokazałeś zdjęcia całej swojej płytki, ale według mnie układ masz podłączony inaczej (nie widać zasilania). Po trzecie nie masz chyba naszego zestawu, więc problemem może być np. zły fotorezystor lub rezystor (który ma jakieś dziwne kolorki) lub jakiś inny element. Nie mam pojęcia czym dokładnie dysponujesz, więc ciężko zdalnie pomóc.

  • Lubię! 1
Link do komentarza
Share on other sites

Zasilanie po dwóch stronach na pewno dobrze, bo zmierzyłem multimetrem i robiłem już inne prpjekty na tym samym podłączeniu. Może i sprawa tego fotorezystora. Ważne, że na wersji z potencjometrem działa 😄

Link do komentarza
Share on other sites

@Karliko, zerknij tutaj: https://pl.wikipedia.org/wiki/Koniec_linii to powinno się wyjaśnić czym jest NL i CR, bo to właściwie nie jest temat związany z samym Arduino 😉

@CharlesX, czyli kolejny raz mamy dowód na to, że można sobie dorobić dodatkowych problemów niewłaściwym sprzętem 😉

  • Pomogłeś! 1
Link do komentarza
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!

Anonim
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.