Skocz do zawartości

Pomocna odpowiedź

@qubacki123, 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 10.04.2019 o 18:56, qubacki123 napisał:

Na jakiej zasadzie powinienem dobrać rezystor do fotorezystora w dzielniku napięcia (ze wzoru na dzielnik napięcia)? Posiadam w zestawie dwa fotorezystory 5-10k oraz 20-30k.

Nie ma to większego znaczenia. Użycia innego fotorezystora sprawi jedynie, że Twój układ będzie reagował trochę inaczej, ale nadal poprawnie. W ramach eksperymentu możesz spokojnie zrobić dwa układy z różnymi fototranzystorami i sprawdzić jak działają 😉

  • Lubię! 1
  • 1 miesiąc później...

Proszę o pomoc. Czy w moim kodzie jest jakiś błąd?

Jak więcej światła pada na fotorezystor po lewej, zapala się dioda po lewej, jak jest ~po równo, to dioda środkowa, a jak na fotorezystor po prawej to nadal świeci się środkowa dioda.

int odczytL = 0;  //odczyt z lewego fotorezystora
int odczytR = 0;  //odczyt z prawego fotorezystora

#define LL 4 //dioda po lewej
#define LR 2 //dioda po srodku
#define RR 8 //dioda po prawej

void setup() {
  pinMode(LL, OUTPUT);
  pinMode(LR, OUTPUT);
  pinMode(RR, OUTPUT);
  pinMode(A4, INPUT); //fotorezystor po lewej
  pinMode(A5, INPUT); //fotorezystor po prawej

  Serial.begin(9600);
}

void loop() {
  digitalWrite(LL, LOW);
  digitalWrite(LR, LOW);
  digitalWrite(RR, LOW);
  
  odczytL = analogRead(A4);
  odczytR = analogRead(A5);

  Serial.print(odczytL);
  Serial.print("     ");
  Serial.println(odczytR);
  delay(250);
  odczytL = map(odczytL, 10, 1020, 1, 5);
  odczytR = map(odczytL, 10, 1020, 1, 5);

  if (odczytL > odczytR){
    digitalWrite(LL, HIGH);
    digitalWrite(LR, LOW);
    digitalWrite(RR, LOW);
  } else if (odczytL == odczytR){
    digitalWrite(LR, HIGH);
    digitalWrite(LL, LOW);
    digitalWrite(RR, LOW);
  } else if (odczytL < odczytR){
    digitalWrite(RR, HIGH);
    digitalWrite(LR, LOW);
    digitalWrite(LL, LOW);
  }
  delay(250);
}

Przechwytywanie.thumb.PNG.cfadc19b6882af24e347de4965e7a1ea.PNG

  • 3 tygodnie później...

Hejka.

Podsyłam swoje rozwiązanie zadanie 4.5. Chodź nie jest ono do końca poprawne ;/ 

int odczyt_potencjometru = 0; // do odczytania liczby z potencjometru
int wczytana_liczba = 0;
int roznica = 0;

#define LedZiel 9
#define LedZol 8
#define LedCzer 7
#define przycisk 4
#define potencjometr A5

void setup() {
  Serial.begin(9600); // ustawienie transmisji

  pinMode(przycisk, INPUT_PULLUP); // wyjscie 4 jako przycisk

  // ustawienia diod jako wyjscie
  pinMode(LedZiel, OUTPUT);
  pinMode(LedZol, OUTPUT);
  pinMode(LedCzer, OUTPUT);
  
}

void loop() {
  // ustawienie poczatkowe diod przed kazda gra
  digitalWrite(LedZiel, LOW);
  digitalWrite(LedZol, LOW);
  digitalWrite(LedCzer, LOW);
  int szansa = 3 ; // ile pozostalo szans
  odczyt_potencjometru = analogRead(A5);
  Serial.println(odczyt_potencjometru); // do sprawdzania jaka jest liczba (opcjonalne)
  while (digitalRead(przycisk) == LOW ){ // jesli przycisk nacisniety
    delay(1000);
    Serial.println("Podaj licze z zakresu 0 do 1023 +/- 50 " );
    delay(1000);
    if ( Serial.available() > 0 ) { // jesli przekazana jest liczba
      wczytana_liczba = Serial.parseInt();
      Serial.print("Podales liczbe:");
      Serial.println(wczytana_liczba);
      roznica = odczyt_potencjometru - wczytana_liczba;

      if (roznica <= 50 && roznica >= -50){
        Serial.println("Wygrales");
        digitalWrite(LedZiel, HIGH);
        digitalWrite(LedZol, LOW);
        digitalWrite(LedCzer, LOW);
      }else{
        szansa = szansa - 1;
        Serial.print("masz prob = ");
        Serial.println(szansa);
        digitalWrite(LedZol, HIGH); 
        digitalWrite(LedCzer, LOW);
        digitalWrite(LedZiel, LOW);
        if( szansa <= 0 ){
          Serial.println("Przegrales");
          digitalWrite(LedZol,LOW);
          digitalWrite(LedZiel,LOW);
          digitalWrite(LedCzer, HIGH);
        }
       }
      } else { // gdy nie przakazano liczby
        Serial.println("nie podano liczby");
        delay(1000);
      }
      
     } 
  
  while (digitalRead(przycisk) == HIGH){ // komunitak gdy nie mamy przycsku wduszonego
      delay(3000);
      Serial.println("wdus przycisk");
  }
  

}

Problem jest taki, że jak wpisze jakąś liczbę to Arduino po przejściu wszystkich warunków sam wstawia drugą liczbę wykonuje wszystkie warunki i dopiero potem czeka na wpisanie drugiej liczby. Czy ktoś wie dlaczego tak jest? Ewentualnie czy ktoś ma jakieś uwagi jak ten kod napisać lepiej, poprawniej?

Dziękuje za podpowiedzi!

4 godziny temu, Ronaldo71888 napisał:

sam wstawia drugą liczbę wykonuje wszystkie warunki i dopiero potem czeka na wpisanie drugiej liczby

A sprawdzałeś jaka to liczba? 🙂 Może zwyczajnie chodzi o znaki końca linii wysyłane przez Monitor Portu Szeregowego (wystarczy zmienić odpowiednią opcję w tym okienku).

  • Pomogłeś! 1
16 godzin temu, Treker napisał:

A sprawdzałeś jaka to liczba? 🙂 Może zwyczajnie chodzi o znaki końca linii wysyłane przez Monitor Portu Szeregowego (wystarczy zmienić odpowiednią opcję w tym okienku).

Super. Dzięki za podpowiedź! Teraz już działa. Powiem szczerze, że nawet nie wiedziałem, że coś takiego wystarczy zmienić w terminalu. Myślałem, że jedyne rozwiązanie to poprawienie kodu tak, żeby czytał znak końca linii. 

Więc nauczyłem się kolejnej rzeczy! Jeszcze raz dzięki! 😄

Co do powyższego kodu to teraz wszystko jest okej. ; )

Witajcie mam banalne pytanie niestety nie mogę znaleźć działającej odpowiedzi...

program dokładnie jak w kursie, jak zmodyfikować linię

Serial.println(napiecie);                       tak by w serial monitorze wyświetlana wartość była napiecie + "V" tj 5.00 V zamiast 5.00?

super bardzo dziękuję!

nasuwa się kolejne pytanie dlaczego fraza poniżej nie działa w tym przypadku?

Serial.println("Napięcie: "+ napiecie + " V");

 

@robal88 witam na forum 🙂

10 godzin temu, robal88 napisał:

nasuwa się kolejne pytanie dlaczego fraza poniżej nie działa w tym przypadku?


Serial.println("Napięcie: "+ napiecie + " V");

W dokumentacji Arduino znajdziesz dokładną informację na ten temat (jest tam praktycznie identyczny "anty" przykład). Zerknij tutaj: https://www.arduino.cc/en/Tutorial/StringAdditionOperator😉

  • 3 tygodnie później...
1024 => 5V
1 => x

1024x = 1*5

x = (1*5V)/1024 = ~0,0049V

A napięciu 5V nie odpowiada wartość 1023?
Więc zamiast:

napiecie = odczytanaWartosc * (5.0/1024.0); //Przeliczenie wartości na napięcie

nie powinno być 5.0/1023.0 ?
Owszem, wartości jest 1024, ale 0 reprezentuje zero, więc przedziałów między nimi jest 1023.

Analogicznie, gdyby przetwornik był 2 bitowy czyli od 0 do 4 to 1=>1,67.
0=>0V
1=>1,67V
2=>3,33V
3=>5V

Gdyby liczyć wg Twojego wzoru to by wyszło: 1=> 5/4=1,25 i by się mapowało:
0=>0V
1=>1,25V
2=>2,5V
3=>3,75V
Czyli chyba bęłdnie, albo ja czegoś nie rozumiem.


Zresztą widzę, że w kodzie w komentarzach ludzie też obliczają dzieląc przez 1023

  • Lubię! 1

@voidtec witam na forum 🙂 Ten temat był tutaj omawiany wiele razy - zdania w tej kwestii są podzielone.

7 godzin temu, voidtec napisał:

Zresztą widzę, że w kodzie w komentarzach ludzie też obliczają dzieląc przez 1023

Dzieje się tak, ponieważ pierwotnie w kursie było właśnie pokazane dzielenie przez 1023, a później zostało zaktualizowane na 1024.

Jedna z dyskusji na ten temat:

 

  • Lubię! 1
  • 3 tygodnie później...

Hej 😄  mam problem z zadaniem 4.5 program nie chce wczytywać danych kiedy jest w instrukcji if dotyczącej wciśnięcia przycisku. Zaczyna działać dopiero kiedy oddzielam reszte if'ow(kod nr.2) i zastanawiam sie czym jest to spowodowane.

#define zielona 10
#define zolta 13
#define czerwona 11
#define przycisk 12
#define potencjometr A5
int wartoscLosu = 0;
String userInput = "";
int intInput = 0;
int proby = 0;

void setup() {

  Serial.begin(9600);
  pinMode(czerwona, OUTPUT);
  pinMode(zielona, OUTPUT);
  pinMode(zolta, OUTPUT);
  pinMode(przycisk, INPUT_PULLUP);
  Serial.println("Losuj");
}

void loop() {

  if (digitalRead(przycisk) == LOW) {
    wartoscLosu = analogRead(potencjometr);
    Serial.println("Podaj liczbę");

    if (Serial.available() > 0) {
    userInput = Serial.readStringUntil('\n');
    Serial.println(userInput);
    intInput = userInput.toInt();
    if (intInput <= (wartoscLosu + 50) && intInput >= (wartoscLosu - 50) ) {
      digitalWrite(zielona, HIGH);
      digitalWrite(czerwona, LOW);
      digitalWrite(zolta, LOW);
      Serial.println("Wygrałeś");
    } else if (proby < 2) {
      digitalWrite(zolta, HIGH);
      digitalWrite(zielona, LOW);
      digitalWrite(czerwona, LOW);

      proby++;
    } else {
      digitalWrite(czerwona, HIGH);
      digitalWrite(zielona, LOW);
      digitalWrite(zolta, LOW);
      Serial.println("Przegrałeś");

    }

  }
  }
}
#define zielona 10
#define zolta 13
#define czerwona 11
#define przycisk 12
#define potencjometr A5
int wartoscLosu = 0;
String userInput = "";
int intInput = 0;
int proby = 0;

void setup() {

  Serial.begin(9600);
  pinMode(czerwona, OUTPUT);
  pinMode(zielona, OUTPUT);
  pinMode(zolta, OUTPUT);
  pinMode(przycisk, INPUT_PULLUP);
  Serial.println("Losuj");
}

void loop() {

  if (digitalRead(przycisk) == LOW) {
    wartoscLosu = analogRead(potencjometr);
    Serial.println("Podaj liczbę");
  }

  if (Serial.available() > 0) {
    userInput = Serial.readStringUntil('\n');
    Serial.println(userInput);
    intInput = userInput.toInt();
    if (intInput <= (wartoscLosu + 50) && intInput >= (wartoscLosu - 50) ) {
      digitalWrite(zielona, HIGH);
      digitalWrite(czerwona, LOW);
      digitalWrite(zolta, LOW);
      Serial.println("Wygrałeś");
    } else if (proby < 2) {
      digitalWrite(zolta, HIGH);
      digitalWrite(zielona, LOW);
      digitalWrite(czerwona, LOW);

      proby++;
    } else {
      digitalWrite(czerwona, HIGH);
      digitalWrite(zielona, LOW);
      digitalWrite(zolta, LOW);
      Serial.println("Przegrałeś");

    }

  }
}

 

@adrianrogalski witam na forum! W pierwszym przypadku program powinien działać poprawnie, jeśli trzymasz cały czas wciśnięty przycisk, a chyba nie o to tu chodziło 😉 Zwróć uwagę, że program w takiej formie sprawdza czy odebrano jakieś dane przez UART tylko "natychmiast po wciśnięciu przycisku", a nie cały czas. Musisz sprawić, że program poczeka do momentu podania danych lub zapętlić część, w której odbierane są dane 🙂

  • Pomogłeś! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...