Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

Behem, witam na forum 🙂

Program wygląda bardzo ładnie - duży plus za komentarze i ładne wcięcia w kodzie!

spwr, przy większej ilości diod warto byłoby pokusić się o wykorzystanie funkcji map (jeśli dobrze pamiętam pojawia się trochę dalej w kursie) oraz ustawianie stanów na wyjściach za pomocą pętli for 🙂

Link do komentarza
Share on other sites

Witam, pisze w zasadzie nie wiedzac czy jeszcze mozna tu podpytywać cos 😋 Kurs juz troche ma a ja dopiero teraz jadez temattem stad dopiero zagaduje. Widzialem wiele rozwiazan ale mimo wszystko chce swoje wymyslec i ...oczywiscie mam problem . Chciałęm rozwiazac warunek mozliwosc pomylki o 50 działaniem - if(liczbaPodana -liczbaUstawiona = +-50) itd... ew . if(liczbaPodana - liczbaUstawiona = 50||-50) ale z racji iż musimy sie komunikować poprzez port seregowy to musze liczbePodana uzyc jak zmienna String , natomiast liczbeUstawiona jako zmienna int . Tyle , że nie moge na takich dwoch zmiennych wykonać takiego działania ....String to ciag znaków a int to liczby całkowite....co porponujecie w takiej sytuacji , by można to w ten sposob rozwiazac ? Będe bardzo wdzięczny za jakakolwiek pomoc 🙂

Link do komentarza
Share on other sites

feniks_, oczywiście - cały czas można podpytywać 🙂

Rozwiązaniem Twojego problemu będzie funkcja toInt(), która konwertuje string na int.

Więcej informacji na jej temat znajdziesz w dokumentacji Arduino: https://www.arduino.cc/en/Reference/StringToInt

Dzięki seredeczne za pomoc 🙂 Znaczy chcesz powiedzieć , że zmienną String trzeba zapisać jako toInt ? Czy zostawić zapis i w funkcji loop zapisać toInt i dopiero jakoś zmienić String na toInt? Wybacz , że tak podpytuje ale ze str wytlumaczenie jest dosyć cieżkie jeszcze dla mnie 😋 A chce jak najszybciej rozwiązać problem bo widze ciekawe artykuly w dalszej cz. kursu o serwomechanizmach a powiedziałęm sobie , że dopóki nie rozwiąze wszystkiego to dalej nie ide z kursem 😋

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

Tzn to akurat rozumiem tylko funkcja jako toInt sama w sobie jest konwersją tzn jakby dodatkiem do nazwy zmiennej a samej funkcji nie mogę przykładowo użyć toInt(nazwa_zmiennej....)no włąsnie i co dalej :X sam zapis jest dla mnie jasny jednak na przykłądzie wrzucają dodatkową funkcje char i to zaczyna komplikować cały przykład tak naprawdę :X albo klasycznie wychodze na słabo kumatego 😋

[ Dodano: 20-02-2017, 20:57 ]

Tak wygląda mój kod na etapie odejmowania String i int oczywiscie po konwertowaniu String na int w "podanejLiczbie" ale coś sie dalej nie konwertuje....:X co w nim jest nie tak przy tym zapisie ?:/

String podanaLiczba = ""; //liczba podana w porcie szereg
int liczbaUstawiona = ""; //liczba ustawiona na pokretle


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


}

void loop() {

 liczbaUstawiona = analogRead(A5); //odczyt z portu analogowego A5
 if (Serial.available() > 0)
 {
   podanaLiczba = Serial.readStringUntil('\n');
   podanaLiczba = podanaLiczba.toInt();
   if (podanaLiczba - liczbaUstawiona = 50||-50)
   {
     Serial.println("wygrales");
   }
 }

}
Link do komentarza
Share on other sites

rozbudowałem swoj kod juz troche dalej , by nie tracic czasu i jak kolega powyzej postanowilem się wzorować na nim gdyż widze jak przekształcił funkcje String na int ale ...u mnie siłą rzeczy nadal to nei funguje nie wiedząc czemu ...


String podanaLiczba = ""; //liczba podana w porcie szereg
int podanaLiczba_int = 0; //zmienna przerobiona z "podanaLiczba"

int liczbaUstawiona = 0; //liczba ustawiona na pokretle

int zielonaLed = 8;
int czerwonaLed = 9;
int zoltaLed = 10;
int przycisk = 11;

bool losowanie = false;
bool start =false;

void setup() 
{
 Serial.begin(9600);
 pinMode(zielonaLed, OUTPUT); // ustawienie diody jako wyjscia
 pinMode(czerwonaLed, OUTPUT); // ustawienie diody jako wyjscia
 pinMode(zoltaLed, OUTPUT); // ustawienie diody jako wyjscia
 pinMode(przycisk, INPUT); // ustawienie przycisku jako sygnalu wejscia

 digitalWrite(przycisk, INPUT_PULLUP); //przycisk sterowany w momencie gdy pojawi sie na nim stan wysoki
 digitalWrite(zielonaLed, LOW); // sstan niski poczatkowo diody
 digitalWrite(czerwonaLed, LOW); // sstan niski poczatkowo diody
 digitalWrite(zoltaLed, LOW); // sstan niski poczatkowo diody

 Serial.println("Witaj w grze Losowych Liczb");
 Serial.println("Ustaw liczbe pokretlem i nacisnij przycisk");
 start =true;
 while (start = true) 
 {
   delay(20);
 }
}

void loop() {
 liczbaUstawiona = analogRead(A5); //odczyt z portu analogowego A5
 podanaLiczba_int = podanaLiczba.toInt(); //podana liczba przeksztalcona na int
 losowanie =true;

 if(digitalRead(przycisk)==HIGH)// po nacisnieciu przycisku ruszy mechanizm gry
 { 
 if (Serial.available() > 0) 
 {
   podanaLiczba = Serial.readStringUntil('\n');
   if (podanaLiczba > liczbaUstawiona + 50 ) // Przypadek wykonania mechanizmu gdy odp nie  miesci sie w zadanym przedziale
   {
     Serial.println("przegrales");
     while(losowanie = false)
     {
       delay(20);
     }
     digitalWrite(zielonaLed, HIGH);
     delay(5000);
     digitalWrite(zielonaLed, LOW);

[ Dodano: 21-02-2017, 23:05 ]

postanowilem pojechac dalej z tematem , bo nie ma co marudzic tylko trzeba jechac z tematem 🙂 Rozwiazalem zadanie 4.6 w miedzy czasie 🙂 Wiem wiem , można by stany ustawić petlą for ...ale nie było jeszczee tego w kursie 🙂


int odczytGora = 0; //zmienna portu A4
int odczytDol = 0; //zmienna portu A5

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

 pinMode(13, OUTPUT);
 pinMode(12, OUTPUT);
 pinMode(11, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(8, OUTPUT);
 pinMode(7, OUTPUT); //ustawienie wskaznikow jako wyjscia

 digitalWrite(13, LOW);
 digitalWrite(12, LOW);
 digitalWrite(11, LOW);
 digitalWrite(10, LOW);
 digitalWrite(9, LOW);
 digitalWrite(8, LOW);
 digitalWrite(7, LOW); // ustawienie wskaznikow w stan wyjsciowy
}

void loop() {
 odczytGora = analogRead(A4); // odczyt z portu analogowego fotorezystora gornego
 odczytDol = analogRead(A5);// odczyt z portu analogowego fotorezystora dolnego
 odczytGora = map(odczytGora, 450, 760 , 1, 4); // ustwienie zakresow podswietlenia (moj fotorezyst. njalepiej dzialal przy tym)
 odczytDol = map(odczytDol, 450, 760, 1, 4);// ustwienie zakresow podswietlenia
 if (odczytGora < odczytDol) { // warunek podswietlenia do gory wskaznika
   if (odczytGora == 4) {
     digitalWrite(10, HIGH); //jedna dioda zapalona
     digitalWrite(11, LOW);
     digitalWrite(12, LOW);
     digitalWrite(13, LOW);
   }
   if (odczytGora == 3) {
     digitalWrite(10, HIGH); // dwie diody zapalone
     digitalWrite(11, HIGH);
     digitalWrite(12, LOW);
     digitalWrite(13, LOW);
   }
   if (odczytGora == 2) {
     digitalWrite(10, HIGH); // trzy diody zapalone
     digitalWrite(11, HIGH);
     digitalWrite(12, HIGH);
     digitalWrite(13, LOW);
   }
   if (odczytGora == 1) {
     digitalWrite(10, HIGH); // cztery diody zapalone
     digitalWrite(11, HIGH);
     digitalWrite(12, HIGH);
     digitalWrite(13, HIGH);
   }
 }
 if (odczytGora > odczytDol) {// warunek podswietlenia do dolu wskaznika
   if (odczytDol == 4) {
     digitalWrite(10, HIGH); //jedna dioda zapalona
     digitalWrite(9, LOW);
     digitalWrite(8, LOW);
     digitalWrite(7, LOW);
   }
   if (odczytDol == 3) {
     digitalWrite(10, HIGH); //dwie diody zapalone
     digitalWrite(9, HIGH);
     digitalWrite(8, LOW);
     digitalWrite(7, LOW);
   }
   if (odczytDol == 2) {
     digitalWrite(10, HIGH); // trzy diody zapalone
     digitalWrite(9, HIGH);
     digitalWrite(8, HIGH);
     digitalWrite(7, LOW);
   }
   if (odczytDol == 1) {
     digitalWrite(10, HIGH); // cztery diody zapalone
     digitalWrite(9, HIGH);
     digitalWrite(8, HIGH);
     digitalWrite(7, HIGH);
   }
 }

}
Link do komentarza
Share on other sites

No ale przecież z klawiatury dostajesz osobne znaki, które razem tworzą właśnie String, który to z kolei dla procesora nie ma żadnej sensownej wartości przydatnej do jakichś obliczeń. W pamięci RAM wygląda to zupełnie inaczej niż binarny integer. Musisz dokonać konwersji tekstu na liczbę dwójkową. A dlaczego Cię to boli?

Marku, źle zadałem pytanie. Przy pomocy Serial.read() nie da się tego zrobić nie korzystając z funkcji toInt() ale poszło tak:

long x;
long y;
void setup() {
 Serial.begin(9600);
}
void loop() {
Serial.println("Podaj liczbe");
while (Serial.available() == 0) {}
x = Serial.parseInt();
Serial.print("Twoja liczba to ");
Serial.println(x);
y=++x;     
Serial.println(y);
}
Link do komentarza
Share on other sites

Świetny kurs !

Czy w przykładzie z pięcioma diodami nie ma błędu?

Napisałeś "

(...)

void loop() {
 odczytanaWartosc = analogRead(A5);//Odczytanie wartości z ADC   
 odczytanaWartosc = map(odczytanaWartosc, 0, 1023, 1, 5);//Przeskalowanie wartości

 if (odczytanaWartosc == 1) { //Pierwszy zakres

(...)

Czy jednak nie powinno być :

(...)

void loop() {
 odczytanaWartosc = analogRead(A5);//Odczytanie wartości z ADC   
 wartoscPrzeskalowana = map(odczytanaWartosc, 0, 1023, 1, 5);//Przeskalowanie wartości

 if (wartoscPrzeskalowana == 1) { //Pierwszy zakres

(...)

?

Link do komentarza
Share on other sites

Tenshuchiyu, kawałek wyżej użyłem nazwy "wartoscPrzeskalowana", aby od razu było wiadomo, że funkcja map zwraca wartość przeskalowaną. W programie skorzystałem z "odczytanaWartosc", bo nie chciałem dodatkowo tworzyć nowej zmiennej. Kod działa poprawnie, ponieważ w poniższej linii następuje zastąpienie wartości zmiennej "doczytanaWartosc", tą nową, przeskalowaną wartością:

odczytanaWartosc = map(odczytanaWartosc, 0, 1023, 1, 5);//Przeskalowanie wartości 
Link do komentarza
Share on other sites

Widzę, że dawno tu nikogo nie było 🙂

Niedawno zacząłem zabawę z kursem.

Poniżej mój kod do zadania 4.6

Wszelkie kometarze mile widziane

/* Dwa fotorezystory, linijka diodowa pokazuje, z ktorej strony jest zrodlo swiatla*/

#define FRLeft A4                  //linia analogowa z podlaczonym lewym fr
#define FRRight A5                 //linia analogowa z podlaczonym prawym fr

int Left=0;                         //wartosc z lewego fr
int Right=0;                        //wartosc z prawego fr
int Dioda=0;                        //numer diody do zapalenia
int DiodaOld=0;                     //dioda poprzednio zapalona

void setup() {
 Serial.begin(9600);
 Serial.println("Start pracy");
 for (int i=2;i<=6;i++){           //inicjacja linijki diodowej oraz test zapalenia diod
   pinMode(i, OUTPUT);
   digitalWrite(i, HIGH);
   delay(300);
   digitalWrite(i, LOW);    
 }
}

void loop() {
 Left=analogRead(FRLeft);        //odczytanie lewego fotorezystora
 Right=analogRead(FRRight);      //odczytanie prawego fotorezystora

 Serial.print("Lewy: ");         //wartosci testowe wysylane na terminal
 Serial.print(Left);
 Serial.print(" Prawy: ");
 Serial.print(Right);
 Serial.print(" Roznica: "); 
 Serial.print(Left-Right);
 Dioda=map(Left-Right,-200, 200, 2, 6);   //Przemapowanie roznicy miedzy dwoma fr na numery diod do zapalenia. Wartosci -200 i 200 zostaly wyznaczone empirycznie podczas oswietlania latarka.
 Serial.print(" Dioda do zapalenia: ");
 Serial.println(Dioda);                   //Koniec wysylania wartosci testowych do terminala

 if (Dioda!=DiodaOld){                    //Weryfikacja, czy potrzebna zmiana zapalenia diody
   digitalWrite(DiodaOld, LOW);           //jesli tak to stara jest gaszona a nowa zapalana
   digitalWrite(Dioda, HIGH);  
   DiodaOld=Dioda;                        //zapamietania jaka dioda byla poprzednio zapalona
 }
 delay(100); 
}

Link do komentarza
Share on other sites

Witam, jest to mój pierwszy komentarz na tym forum i prawdopodobnie bardzo głupi. Chciałbym się spytać jak skleić te 3 linie kodu w 1. Zmienna napięcie jest typu float. Gdy piszę to następująco:

 Serial.println("Napiecie wynosi:" + napiecie + "V"); 

kompilator wyrzuca mi błąd. Poniżej jest poprawnie, jednak program wypisuje mi to w 3 liniach, a chciałbym osiągnąć taki rezultat: Napiecie wynosi: 4.20V

  Serial.println("Napiecie wynosi:");
    Serial.println(napiecie);
    Serial.println("V");     

Z góry dziękuję za pomoc.

Link do komentarza
Share on other sites

Nie możesz zrobić tej pierwszej opcji bo napisy są typu char*,a napięcie masz pewnie w int lub float i kompilator nie wie jak połączyć ze sobą te dwa typy danych.

Jedną z prostszych opcji rozwiązania tego problemu to właśnie to co zaproponowałeś (trzy wywołania funkcji print). Możesz też ręcznie zamieniać float na ciąg znaków, łączyć ze sobą trzy ciągi i wysyłać je jednym wywołaniem funkcji, ale to raczej nie ma sensu.

Trzecia opcja to wykorzystanie klasy String (mówiąc szczerze na Arduino nie korzystałem, więc nie wiem jaki jest zakres zastosowania) i konwertować float na string (jeśli jest taka metoda w bibliotece Arduino) i dla stringów już jest określona operacja '+'.

EDIT: ups, nie do końca zrozumiałem o co chodzi (że nie ma być nowych linii). Myślałem, że autor pytania chce koniecznie zmieścić wszystko w jednym wywołaniu Serial.print(). 😳

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.