Skocz do zawartości

Kurs Arduino - #6 - kontynuacja UART, serwomechanizmy


Pomocna odpowiedź

Witajcie,

W Podsumowaniu zauważyłem błąd w zdaniu, dwa razy powtarza się ze smutkiem.

Cytat

Część dodatkowa, uzupełniająca wyszła całkiem długa. Mam jednak nadzieję, że będzie pomocna. Ze smutkiem po raz kolejny ze smutkiem stwierdzam, że rozpisałem się zbyt mocno.

 

  • Lubię! 1
Link to post
Share on other sites

Witam czytających. Mam problem z zadaniem 6.2 . Otóż jak wpisuje literę koloru to oprócz zaświecenia się diody na Monitorze portu szeregowe wyświetla się tekst z błędem mimo że jeden z warunków został spełniony. Nie wiem gdzie popełniam błąd. Oto mój kod

#define zielona 3
#define czerwona 2

int odebraneDane = 0; //Pusty ciąg odebranych danych

void setup() {
  Serial.begin(9600); //Uruchomienie komunikacji
  pinMode(zielona, OUTPUT); //Konfiguracja wejsć
  pinMode(czerwona, OUTPUT);

  digitalWrite(zielona, LOW); //Wyłączamy diody
  digitalWrite(czerwona, LOW); 
  Serial.println("Wpisz kolor - c (czerwony) lub z (zielony)");
}

void loop() {

  while(Serial.available() == 0) {}
  odebraneDane = Serial.read();

  switch (odebraneDane) {

    case 'z':

      digitalWrite(zielona, HIGH); //To włączamy diodę zieloną
      delay(1000);
      digitalWrite(zielona, LOW);

    break;

    case 'c':

      digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną
      delay(1000);
      digitalWrite(czerwona, LOW);

    break;

    default:

      Serial.println("Podałes złe dane!");

    break;

  }
 }

Z góry dziękuje za odpowiedzi.

Edit: Już nieważne. Znalazłem rozwiązanie.

Edytowano przez Wortan
Link to post
Share on other sites
15 godzin temu, Wortan napisał:

Edit: Już nieważne. Znalazłem rozwiązanie.

@Wortan podziel się rozwiązaniem swojego problemu - na pewno będzie to pomocne dla kogoś w przyszłości 🙂

Link to post
Share on other sites

Hej wszystkim, to moja wersja rozwiązania zadania 6.1 🙂  Zostawiam ją tutaj i lecę przerabiać kurs dalej.

#define przycisk 7
int liczbaWcisniec = 0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);// Rozpoczęcie transmisji danych
  pinMode(przycisk, INPUT_PULLUP);//Przycisk
}


void loop() {
  // put your main code here, to run repeatedly:
  if( digitalRead(przycisk) == LOW ) { //Jesli przycisk zostanie wcisniety
    int fotorezystor1 = analogRead(A0);
    int fotorezystor2 = analogRead(A1);
    int potencjometr = analogRead(A2);
    liczbaWcisniec+=1;
  
    Serial.print("Fotorezystor 1: ");
    Serial.print(fotorezystor1*5.0/1024.0);
    Serial.print("[V] \t Fotorezystor 2: ");
    Serial.print(fotorezystor2*5.0/1024.0);
    Serial.print("[V] \t Potencjometr: ");
    Serial.print(potencjometr*5.0/1024.0);
    Serial.print("[V] \t Liczba wcisniec: ");
    Serial.print(liczbaWcisniec);
    Serial.println();
  }
 delay(200);
}

 

  • Lubię! 1
Link to post
Share on other sites

@kludo fajnie że wrzuciłaś swoje rozwiązanie!

Dnia 2.10.2020 o 17:08, kludo napisał:

Zostawiam ją tutaj i lecę przerabiać kurs dalej.

A ja może Cię zawrócę na chwilę 😉 taki drobny szczegół, ale edukacyjny - a przytrzymaj przycisk w tym układzie, ile razy wyświetli się linijka?

Cytat

podłączonego do Arduino wysyłaj jeden raz linijkę zawierającą informacje:

W treści zadania jest dodatkowy haczyk, klikasz przycisk i wyświetla sięnapis ale tylko raz, puszczasz i klikasz znowu, trzymasz, wyświetl się ale raz i czeka. Jak to zrobić 🙂

Ten artykuł może się przydać:

 

Edytowano przez Gieneq
  • Lubię! 2
Link to post
Share on other sites

@Gieneq  Dziękuję za zwrócenie uwagi na haczyk, przyznam że myślałam, że szybkie naciskanie załatwi sprawę haha dobrze było się doedukować. Po poprawce mój kod wygląda następująco: 

#define przycisk 7
int liczbaWcisniec = 0;
int ostatniStan = HIGH;


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);// Rozpoczęcie transmisji danych
  pinMode(przycisk, INPUT_PULLUP);//Przycisk
}


void loop() {
int stan = digitalRead(przycisk);
  if( stan == LOW && ostatniStan == HIGH ) { //Jesli przycisk zostanie wcisniety
    int fotorezystor1 = analogRead(A0);
    int fotorezystor2 = analogRead(A1);
    int potencjometr = analogRead(A2);
    liczbaWcisniec+=1;
  
    Serial.print("Fotorezystor 1: ");
    Serial.print(fotorezystor1*5.0/1024.0);
    Serial.print("[V] \t Fotorezystor 2: ");
    Serial.print(fotorezystor2*5.0/1024.0);
    Serial.print("[V] \t Potencjometr: ");
    Serial.print(potencjometr*5.0/1024.0);
    Serial.print("[V] \t Liczba wcisniec: ");
    Serial.print(liczbaWcisniec);
    Serial.println();
  }
  ostatniStan = stan;
  delay(50);
}

 

  • Lubię! 1
Link to post
Share on other sites

Cześć,

 

Potrzebuje pomocy w zadanku 6.2

#define zielona 8
#define czerwona 9

String odebraneDane = ""; //Pusty ciąg odebranych danych

void setup() {
  Serial.begin(9600); //Uruchomienie komunikacji
  pinMode(zielona, OUTPUT); //Konfiguracja wyjść
  pinMode(czerwona, OUTPUT);
  
  digitalWrite(zielona, LOW); //Wyłączamy diody
  digitalWrite(czerwona, LOW);
}

void loop() {
  if(Serial.available() > 0) { //Czy Arduino odebrało dane
    //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane
    odebraneDane = Serial.readStringUntil('\n'); 
  
    switch (odebraneDane) {
      case "zielona": //Jeśli odebrano slowo zielona
      digitalWrite(zielona, HIGH);
      delay(1000);
      digitalWrite(zielona, LOW);
      break;
      case "czerwona":
      digitalWrite(czerwona, HIGH);
      delay(1000);
      digitalWrite(czerwona, LOW);
      break;
      default:
      Serial.println("Błędne hasło!");
      break;
    }
  }
}

Wyskakuje mi błąd:

Arduino:1.8.13 (Windows 10), Płytka:"Arduino Uno"





















C:\Users\jargu\OneDrive\Dokumenty\Arduino\6_22\6_22.ino: In function 'void loop()':

6_22:20:25: error: switch quantity not an integer

     switch (odebraneDane) {

                         ^

6_22:21:12: error: could not convert '"zielona"' from 'const char [8]' to '<type error>'

       case "zielona": //Jeśli odebrano slowo zielona

            ^~~~~~~~~

6_22:26:12: error: could not convert '"czerwona"' from 'const char [9]' to '<type error>'

       case "czerwona":

            ^~~~~~~~~~

exit status 1

switch quantity not an integer



Ten raport powinien zawierać więcej informacji jeśli w 
File -> Preferencje zostanie włączona opcja "Pokaż
szczegółowe informacje podczas kompilacji"

Proszę o pomoc.

Link to post
Share on other sites

Poprawiłem zadanie 6.2

#define zielona 8
#define czerwona 9

int odebraneDane = ""; //Pusty ciąg odebranych danych

void setup() {
  Serial.begin(9600); //Uruchomienie komunikacji
  pinMode(zielona, OUTPUT); //Konfiguracja wyjść
  pinMode(czerwona, OUTPUT);
  
  digitalWrite(zielona, LOW); //Wyłączamy diody
  digitalWrite(czerwona, LOW);
}

void loop() {
  if(Serial.available() > 0) { //Czy Arduino odebrało dane
    //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane
    odebraneDane = Serial.read(); 
  
    switch (odebraneDane) {
      case 'z': //Jeśli odebrano slowo zielona
      digitalWrite(zielona, HIGH);
      delay(1000);
      digitalWrite(zielona, LOW);
      break;
      case 'c':
      digitalWrite(czerwona, HIGH);
      delay(1000);
      digitalWrite(czerwona, LOW);
      break;
      default:
      Serial.println("Błędne hasło!");
      break;
    }
  }
}

 

Przesyłam również 6.3

#include <Servo.h> //Biblioteka odpowiedzialna za serwa
 
Servo serwomechanizm;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 
byte pozycja = 0; //Aktualna pozycja serwa 0-180
int pozycjaPoprzednia = 0;

//Kalibracja
int minOdczyt = 1023; //Wartośc minimalna z fotorezystora
int maxOdczyt = 0; //Wrtość maksymalna na fotorezstorze

void setup() { 
  serwomechanizm.attach(11);  //Serwomechanizm podłączony do pinu 11
  Serial.begin(9600);
} 
 
void loop() 
{ 
  int odczytCzujnika = analogRead(A5); //Odczytujemy wartość z czujnika

//KALIBRACJA
  if (odczytCzujnika < minOdczyt) {
    minOdczyt = odczytCzujnika; //Zapisuje najmiejsza wartosc która pokazala sie na fotorezystorze
  }
  if (odczytCzujnika > maxOdczyt) {
    maxOdczyt = odczytCzujnika; //Zapisuje najwieksza wartosc która pokazala sie na fotorezystorze
  }

//USTAWIENIE POZYCJI SERWA
  pozycja = map(odczytCzujnika, minOdczyt, maxOdczyt, 0, 180); //Zamieniamy ją na pozycję serwa

  if (abs(pozycja-pozycjaPoprzednia) > 5) { //Sprawdzamy czy pozycje różnią się o ponad 5 stopni
    serwomechanizm.write(pozycja); //Wykonajujemy ruch
    pozycjaPoprzednia = pozycja; //Zapamiętujemy aktualną pozycję jako poprzednią
  }
  
  Serial.println(odczytCzujnika); //Wysyłamy wartość do terminala
  delay(300); //Opóźnienie dla lepszego efektu
}

Proszę o informacje czy dobrze wykonałem kalibracje. Na razie nie mam możliwości testowania kodów na arduino.

Link to post
Share on other sites
(edytowany)

zadanie 6.1 tylko ja zrobiłem z wykorzystaniem  : DEC, HEX, OCT, BIN

void setup(){
  Serial.begin(9600);
  pinMode(8, INPUT_PULLUP);
}


void loop(){
    
    int potencjometr = analogRead(A5);
    int fotorezystor_I = analogRead(A4);
    int fotorezystor_II = analogRead(A3);
    
 if(digitalRead(8)==HIGH){
  delay(500);
  wcisnienciePrzycisku++;
 
  Serial.print("potencjometr: ");
  Serial.print(potencjometr, DEC);
  Serial.print("[DEC]\t");
  Serial.print(potencjometr, HEX);
  Serial.print("[HEX]\t");
  Serial.print(potencjometr, OCT);
  Serial.print("[OCT]\t");
  Serial.print(potencjometr, BIN);
  Serial.print("[BIN]\n");
  Serial.println();
  Serial.print("fotorezystor_I: ");
  Serial.print(fotorezystor_I, DEC);
  Serial.print("[DEC]\t");
  Serial.print(fotorezystor_I, HEX);
  Serial.print("[HEX]\t");
  Serial.print(fotorezystor_I, OCT);
  Serial.print("[OCT]\t");
  Serial.print(fotorezystor_I, BIN);
  Serial.print("[BIN]\n");
  Serial.println();
  Serial.print("fotorezystor_II: ");
  Serial.print(fotorezystor_II, DEC);
  Serial.print("[DEC]\t");
  Serial.print(fotorezystor_II, HEX);
  Serial.print("[HEX]\t");
  Serial.print(fotorezystor_II, OCT);
  Serial.print("[OCT]\t");
  Serial.print(fotorezystor_II, BIN);
  Serial.print("[BIN]\n");
  Serial.println();
  Serial.print(" przycisk wcisnieto ");
  Serial.print(wcisnienciePrzycisku);
  Serial.print(" razy.\n");
  Serial.println();
 
 


  delay(1000);

  while(digitalRead(8)==HIGH){
    delay(25);
  }
  }
}

 

Edytowano przez Gieneq
Zachęcam do używania bloku kodu
  • Lubię! 1
Link to post
Share on other sites

@Anthony fajnie że wykorzystałeś coś od siebie 🙂 

Mam jeszcze propozycję, w pytaniu jest informacja żeby wyświetlić tekst 1 raz po wciśnięciu przycisku. Widzę że masz licznik wciśnięć, ale samo sprawdzenie stanu to nie tędy droga 😉 

W ramach zadania dodatkowego zapoznaj się z tym artykułem, który specjalnie przygotowałem pod to zadanie:

 

Link to post
Share on other sites

Witam,

głupie pytanie ale jako początkujący nie mogę znaleźć na nie odpowiedzi. Po co w przykładzie z miernikiem światła jest jasnoniebieski kabelek podłączony do VIN? Nie ma opisu tego

  • Lubię! 1
Link to post
Share on other sites

@hafer witam na forum, jeżeli pytasz o ten schemat montażowy to kabelek ten doprowadza zasilanie do stabilizatora. W tym zadaniu użyte jest serwo i nie jest zalecanie podłączanie go do razem z układami cyfrowymi Arduino. Więc poprowadzono zasilanie z pinu Vin, na któym występuje napięcie zbliżone do tego na wejściu koncentrycznym z baterią 9V. W ten sposób na stabilizator dajemy około 9V i uzyskujemy osobne 5V wyłącznie dla serwomechanizmu.

  • Lubię! 1
  • Pomogłeś! 1
Link to post
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

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.