Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

Dobrze niech będzie, źle się wyraziłem może. W mojej książce był temat przedstawiony w ten sposób więc tak przyjąłem, choć może to się wydać nie intuicyjne na poczatku. Zdarzylo mnie się popełnic kilka razy taki błąd z = zamiast == więc to podejście wydawało mi się jak najbardziej sensowne. 

Nie wiem co masz do mojego zachowania 😶 bardzo często zadaje pytania, gdy mam jakis problem i nie pamiętam, żebym się wykłócał z kimś 🤔

Link do komentarza
Share on other sites

8 godzin temu, Krawi92 napisał:

Dobrze niech będzie, źle się wyraziłem może. W mojej książce był temat przedstawiony w ten sposób więc tak przyjąłem, choć może to się wydać nie intuicyjne na poczatku. Zdarzylo mnie się popełnic kilka razy taki błąd z = zamiast == więc to podejście wydawało mi się jak najbardziej sensowne. 

Nie wiem co masz do mojego zachowania 😶 bardzo często zadaje pytania, gdy mam jakis problem i nie pamiętam, żebym się wykłócał z kimś 🤔

Z jakiej książki korzystałeś , możesz podać autora, tytuł?

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

 

witam udało mi się zrobić zadanie 4.5

int rozwiazanie = 0;
int odebraneDaneINT = 0;
String odebraneDane = "";




void setup() {
 Serial.begin(9600);
 pinMode(7,INPUT_PULLUP);
 pinMode(8,OUTPUT);
 pinMode(9,OUTPUT);
 pinMode(10,OUTPUT);

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

void loop() {
  Serial.println("Witaj w grze");
 
  delay(1000);

  Serial.println("Przekrec potenjometr w losowe miejsce, a nastepnie wcisnij przycisk");

  delay(1000);

  while(digitalRead(7) == HIGH) {}
  delay(500);

  rozwiazanie = analogRead(A1);
 // Serial.println(rozwiazanie);
for (int i=0; i <= 3 ; i++){
   
  Serial.println("Zgaduj liczby od 0 do 1023");
  //Serial.println(i);

  while(digitalRead(7) == HIGH) {}
  delay(500);

  if(Serial.available() > 0) {
    odebraneDane = Serial.readStringUntil('\n');
    odebraneDaneINT = odebraneDane.toInt();
    Serial.println(odebraneDane);
    }

  if (odebraneDaneINT <= rozwiazanie+50 && odebraneDaneINT >= rozwiazanie-50){
  Serial.println("Wygrales!!!");
  digitalWrite(8,HIGH);
  delay(3000);
  digitalWrite(8,LOW);
  i=4;
  
  }
 else if (2-i == 0) {
 Serial.println("Przegrales");
 digitalWrite(9,HIGH);
 delay(3000);
 digitalWrite(9,LOW);
 i=4;
  }
  else{
  Serial.print("zostaly ci jeszcze "); 
  Serial.print(2 - i);
  Serial.print(" proby");
  Serial.print(" ");
  digitalWrite(10,HIGH);
  delay(3000);
  digitalWrite(10,LOW);
 }
 }

}


 

niestety nie wiedziałem jak zmienić zmienną string na inta i musiałem podejrzeć w jednym z komentarzy, tak to sam zrobiłem

sprawiło mi to problemy nie powiem w końcu jest

 

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

int daneL = 0;
int daneP = 0;
int regulacja = 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() {

  for (int i = 0; i >= -1; i++) {
  
  regulacja = analogRead(A3);
  
  daneL = analogRead(A4);
  daneP = analogRead(A5);
  
  if (i == 1000) {
  Serial.print(daneL);
  Serial.println("Lewo");
  Serial.print(daneP);
  Serial.println("Prawo");
  Serial.print(regulacja);
  Serial.println("Regulacja");
  i = 0;
  }
  
  delay(3);

  if(daneL >= regulacja or daneP >= regulacja) {

  if (daneL - daneP >= 15 or daneP - daneL >= 15){

  if (daneL < daneP){
    digitalWrite(12,HIGH);
    digitalWrite(9,LOW);
    digitalWrite(8,LOW);

    if (daneP - daneL >= 150){
    digitalWrite(11,HIGH);
    digitalWrite(9,LOW);
     }
    else {
      digitalWrite(11,LOW);
      }
    if (daneP - daneL >= 270) {
      digitalWrite(10,HIGH);
      }
      else {
        digitalWrite(10,LOW);
        } 
    }
  else if (daneL > daneP){
    digitalWrite(8,HIGH);
    digitalWrite(12,LOW);
    digitalWrite(11,LOW);

    if (daneL - daneP >= 150){
      digitalWrite(9,HIGH);
      digitalWrite(11,LOW);
      }
      else {
        digitalWrite(9,LOW);
      }
       if (daneL - daneP >= 270) {
      digitalWrite(10,HIGH);
      }
      else {
        digitalWrite(10,LOW);
        } 
      }
    }
  else {
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
  digitalWrite(12,LOW);
   }
  }
  else {
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
  digitalWrite(12,LOW);
  }
 }
}

Witam udało mi się zrobić zadanie 4.6 

trochę prymitywnie bo na samych funkcjach if 😅 cóż ważne że działa. oczywiście funkcja for jest tu niepotrzebna ale dałem ją dla własnej wygody i aby trochę się pobawić. tak samo zmienna "regulacja", zamysł był taki żeby regulować czułość ale w sumie nie wiedziałem jak sie za to wziąć i czy jest wogule potrzebne wiec działa tutaj głównie jako wyłącznik.

 

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

To ja też się pochwalę moją wersją zadania domowego numer 4.6
Właściwie to ten mój cały program w pętli loop() ma raptem sześć linijek i gotowe.

#define foto_Gorny A4 // Wejście dla fotorezystora górnego
#define foto_Dolny A5 // Wejście dla fotorezystora dolnego

#define PIN_GornyMax 13 // Numer PIN dla diody górnej mocnej
#define PIN_Gorny 12 // Numer PIN dla diody górnej
#define PIN_Srodek 11 // Numer PIN dla diody środkowej
#define PIN_Dolny 10 // Numer PIN dla diody dolnej
#define PIN_DolnyMax 9 // Numer PIN dla diody dolnej mocnej

int OdczytRoznica = 0; // Różnica w odczytach

void setup() {
  // Konfiguracja wyjść pod diody LED
  pinMode(PIN_GornyMax, OUTPUT);
  pinMode(PIN_Gorny, OUTPUT);
  pinMode(PIN_Srodek, OUTPUT);
  pinMode(PIN_Dolny, OUTPUT);
  pinMode(PIN_DolnyMax, OUTPUT);
}

void loop() {
  // Pobieramy odczyty, dzielimy przez 100 i liczymy różnicę w odczytach (wszystko po to aby porównywać różnice w "setkach")
  OdczytRoznica = ( analogRead(foto_Dolny) / 100 ) - ( analogRead(foto_Gorny) / 100 );
  
  // Ustalamy, które diody mają świecić
  digitalWrite(PIN_GornyMax, OdczytRoznica <= -3);
  digitalWrite(PIN_Gorny, OdczytRoznica == -2);
  digitalWrite(PIN_Srodek, (OdczytRoznica >= -1) && (OdczytRoznica <= 1));
  digitalWrite(PIN_Dolny, OdczytRoznica == 2);
  digitalWrite(PIN_DolnyMax, OdczytRoznica >= 3);
  
  // Czekamy nieco aby za szybko nie zmieniać świecenia diod
  delay(100);
}

Oczywiście na początku zrobiłem wielowariantowego if {} else {}

Później wykombinowałem sobie, że przecież HIGH == 1 == TRUE oraz LOW == 0 == FALSE

I tak doszedłem do tego, że warunki mogę zamieścić już w samej funkcji digitalWrite() 🤩

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

Witam, dzisiaj chciałbym przedstawić moje iście kabaretowe rozwiązanie zad. 4.5 pod tytułem:

                                                         "Jak nie robić zadania nr.4.5?"

#define red 8
#define yellow 9
#define green 10
#define button 11
boolean NumberToGuessSetAndConfirmed = false, startInfoSend = false, serialAvailable = false; 
boolean NumberGuessedInfoSend = false, allowToWinOrLoose = false, NumberBadGuessInfoSend_1 = false;
boolean firstGuessWrong = false, secondGuessWrong = false, thirdGuessWrong = false;
boolean NumberBadGuessInfoSend_2 = false, NumberBadGuessInfoSend_3 = false;
int readValue = 0, GuessTryNumber = 0, GuessDifference = 0;

void setup(){
  Serial.begin(9600);
  
  pinMode(red, OUTPUT);
  pinMode(yellow, OUTPUT);
  pinMode(green, OUTPUT);
  pinMode(button, INPUT_PULLUP);
  
  digitalWrite(red, LOW);
  digitalWrite(yellow, LOW);
  digitalWrite(green, LOW);
}
//UWAGA USTAWIC BRAK ZAKONCZENIA LINI W MONITORZE PRT SZERG. DLA POPRAWNEGO DZIALANIA GRY!!!!11!11
void loop(){
  while(allowToWinOrLoose == false){//glowna petla while
  while (NumberToGuessSetAndConfirmed == false){
    if(startInfoSend == false){
  Serial.println(" ");// daje odstep miedzy liniami
  Serial.println(" ");// daje odstep miedzy liniami 
  Serial.println(" ");// daje odstep miedzy liniami 
  Serial.println(" ");// daje odstep miedzy liniami     DUUUZO ODSTEPU
  Serial.println(" ");// daje odstep miedzy liniami 
  Serial.println(" ");// daje odstep miedzy liniami 
  Serial.println(" ");// daje odstep miedzy liniami 
  Serial.println("WELCOME BACK IN THE GAME");
  Serial.println("Adjust the potentiometer to set a number to guess");
  Serial.println("and confirm your choice by pressing the button");
  Serial.println(" ");
  startInfoSend = true; }
  readValue = analogRead(A5);
  if(digitalRead(button) == LOW){
    Serial.println("You set a number to guess (from 1 to 1023)");
    Serial.println("Now try to guess that number by entering it here:");
    Serial.println(" ");
    //Serial.println(readValue); linijka testowa podaje wartosc odczytana z potencjometra
    NumberToGuessSetAndConfirmed = true;
  }
}//wylot z While "setupowego" (juz ustawiono liczbe) teraz ta petla nie jest robiona
while(Serial.available() == 0) {}
 GuessTryNumber = Serial.parseInt();
 //serialAvailable = true; //wskazuje na wprowadzenie info z monitora szeregowego(niepotrzebne??)

GuessDifference = abs(GuessTryNumber-readValue); //wskazuje o ile sie roznia
//Serial.println(GuessDifference); linijka testowa podaje roznice miedzy liczbami (wiadomo jkmi)

if(GuessDifference < 50){
  allowToWinOrLoose = true;
}


if(allowToWinOrLoose == true && NumberGuessedInfoSend == false){
digitalWrite(green, HIGH);
Serial.println("congrats you guessed !!!");
delay(2000);
digitalWrite(green, LOW);
NumberGuessedInfoSend = true;
}
else if (allowToWinOrLoose == false && NumberBadGuessInfoSend_1 == false){
  digitalWrite(yellow, HIGH);
  Serial.println("WROO00OOO000NG");
  Serial.println("Try again 2 tries left");
  delay(2000);
  digitalWrite(yellow, LOW);
  NumberBadGuessInfoSend_1 = true;
  firstGuessWrong = true;
}
else if(allowToWinOrLoose == false && firstGuessWrong == true && NumberBadGuessInfoSend_2 == false ){
  digitalWrite(yellow, HIGH);
  Serial.println("WROO00OOO000NG");
  Serial.println("Try again 1 try left");
  delay(2000);
  digitalWrite(yellow, LOW);
  NumberBadGuessInfoSend_2 = true;
  secondGuessWrong = true;
}
else if(allowToWinOrLoose == false && secondGuessWrong == true && NumberBadGuessInfoSend_3 == false){
  digitalWrite(red, HIGH);
  Serial.println("WROO00OOO000NG");
  Serial.println("GAME OVER");
  delay(2000);
  digitalWrite(red, LOW);
  NumberBadGuessInfoSend_3 = true;
  allowToWinOrLoose = true;
}

}//while caly duzy
//teraz reset zmiennych (jazda od poczatku)
NumberToGuessSetAndConfirmed = false;
startInfoSend = false;
serialAvailable = false; 
NumberGuessedInfoSend = false;
allowToWinOrLoose = false;
NumberBadGuessInfoSend_1 = false;
firstGuessWrong = false;
secondGuessWrong = false;
thirdGuessWrong = false;
NumberBadGuessInfoSend_2 = false;
NumberBadGuessInfoSend_3 = false;
readValue = 0;
GuessTryNumber = 0;
GuessDifference = 0;

}

Nie jestem specjalistą w te tematy ale już na pierwszy rzut  niewytrenowanego oka przestrzeń zajmowana przez zdefiniowane zmienne sugeruje jakoby miałby to być fragment jakiegoś homeryckiego porównania rodem z Iliady.
Dodatkowo nie wiem za bardzo jak rozwiązać problem powodujący konieczność ustawienia ,,braku zakończenia linii" w monitorze prt szrgwg.

I need somebody
(Help) not just anybody
(Help) you know I need someone, heeeelp!!!!😕

 

PS. Jakby co to program dziala jak nalezy, no ale troche za <--------------------------> jest

Link do komentarza
Share on other sites

@LieutenantDan faktycznie program wyszedł bardzo długi, ale najważniejsze, że działa - teraz możesz spróbować go skrócić.

3 godziny temu, LieutenantDan napisał:

Dodatkowo nie wiem za bardzo jak rozwiązać problem powodujący konieczność ustawienia ,,braku zakończenia linii" w monitorze prt szrgwg.

Dlaczego jest to dla Ciebie problemem? To tylko kwestia ustawienia (tak samo jak się ustawia np. prędkość komunikacji). Czy chcesz to zmienić tylko dlatego, aby nie trzeba było klikać tej opcji w monitorze portu szeregowego?

Link do komentarza
Share on other sites

Dnia 11.08.2022 o 12:08, Treker napisał:

@LieutenantDan (...) daj znać czy naprowadziło Cię to na rozwiązanie 🙂 ...

tak jakby, rozumiem, że gdy jest ustawiona ,,nowa linia'' to po zatwierdzeniu jest wysyłana informacja od użytkownika jakby 2 razy:

1. raz to liczba 2. raz to puste miejsce zamieniane na 0 przez funkcje parseInt() przez to wykrywa to jako 2 błędne próby od użytkownika
Rozwiązałem ten problem, jednak nie do końca czuje co oznaczają te opcje nowa linia, brak nowej linii, powrót karetki itd.
Czy jest jakiś artykuł na ten temat kiedy czego używać na co uważać?

while(Serial.available() == 0) {}//czeka na info od uzytkownika
 GuessTryNumber = Serial.parseInt();
 
 if(GuessTryNumber > 0){//chroni przed koniecznoscia wpisywania braku nowej lini w mntrze prtszrgwg
program bla bla bla dioda miga robi brrrrr
 }

Tak rozwiązałem problem konieczności ustawienia braku nowej linii

Edytowano przez LieutenantDan
Link do komentarza
Share on other sites

Nie, nie rozumiesz.

Funkcja parseInt pobiera sobie kolejne znaki, aż trafi na koniec. Takim typowym końcem jest znak nowej linii. Jeśli go nie będzie, skąd ma wiedzieć że wysłałeś już wszystko, czy może za chwilę pojawi się kolejna cyfra?

I nie jest to wysyłanie dwa razy. Po prostu wysyłasz coś i informację "To już wszystko".

Link do komentarza
Share on other sites

Dnia 12.08.2022 o 16:47, LieutenantDan napisał:

Rozwiązałem ten problem, jednak nie do końca czuje co oznaczają te opcje nowa linia, brak nowej linii, powrót karetki itd.

W uproszczeniu: to są po prostu dodatkowe znaki, które są doklejane do ciągu, który wysyłasz. Wiem, że to nie ten kurs, ale dokładniejszy opis tego zagadnienia możesz przeczytać tutaj: https://forbot.pl/blog/kurs-stm32l4-komunikacja-przez-uart-debugger-stm32-uart-id46577 Przeczytaj co jest od nagłówka: "O co chodzi ze znakami końca linii?"

  • Pomogłeś! 1
Link do komentarza
Share on other sites

#define green1 12
#define green2 11
#define yellow 10
#define red1 9
#define red2 8

int value = 0;
int changed = 0;

void setup() {
  // put your setup code here, to run once:
  pinMode(green1, OUTPUT);
  pinMode(red1, OUTPUT);
  pinMode(green2, OUTPUT);
  pinMode(red2, OUTPUT);
  pinMode(yellow, OUTPUT);
  changed = analogRead(A5);
}

void loop() {
  // put your main code here, to run repeatedly:
  value = analogRead(A5);
  if(changed != value){
    digitalWrite(green1, LOW);
    digitalWrite(green2, LOW);
    digitalWrite(red1, LOW);
    digitalWrite(red2, LOW);
    digitalWrite(yellow, LOW);
    changed = value;
  }
  if(value < 204){
    digitalWrite(red2, HIGH);
  }
  else if(value < 409){
    digitalWrite(red1, HIGH);
  }
  else if(value < 613){
    digitalWrite(yellow, HIGH);
  }
  else if(value < 818){
    digitalWrite(green2, HIGH);
  }
  else{
    digitalWrite(green1, HIGH);
  }
  delay(250);
}

A to moje autorskie rozwiązanie świecących się pięciu diod. W zamierzeniu jeśli zmieniła się wartość zmiennej(changed) na potencjometrze to wyłączamy wszystkie diody i włączamy tę na której jest nowa wartość. 

  • Lubię! 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.