Skocz do zawartości
Komentator

Kurs Arduino - #4 - Przetwornik ADC

Pomocna odpowiedź

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.

Udostępnij ten post


Link to post
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(). 😳

Udostępnij ten post


Link to post
Share on other sites

println dołącza zawsze na końcu znak nowej linii. Użyj print:

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

A w razie kolejnych wątpliwości zawsze zaczynaj od dokumentacji:

https://www.arduino.cc/en/reference/serial

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Witam! Dopiero się uczę i potrzebuję pomocy. Próbowałem zrobić zadanie 4.5 ale niestety nie potrafię rozwiązać jednego problemu.

[ podany kod służy jedynie do zademonstrowania problemu ]

Chciałbym aby po naciśnięciu przycisku program czekał na podanie imienia i dopiero później przechodził do dalszej części programu.

Obecnie wygląda to tak, że po wpisaniu imienia nic się nie dzieje. Dopiero po kolejnym naciśnięciu przycisku pojawia się tekst "Podaj imię:" oraz "Witaj " + odebraneDane + "!".

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

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

void loop ()
{
  if (digitalRead(8) == LOW)
  {
   delay(300);   
   Serial.println("Podaj imię:"); 


      if(Serial.available() > 0) { 
      odebraneDane = Serial.readStringUntil('\n'); 
      Serial.println("Witaj " + odebraneDane + "!"); 
      }
   }       
}

Udostępnij ten post


Link to post
Share on other sites

MrSnowman24688, witam na forum! Podaję hasło klucz: pętla while 🙂 Bez tego będzie ciężko. Nie podaję rozwiązania, spróbuj najpierw podziałać coś samodzielnie.

Udostępnij ten post


Link to post
Share on other sites

MrSnowman24688, tak, dokładnie o to 🙂 Inna opcja zapisu (z wykorzystaniem wykrzyknika jako negacji):

while(!Serial.available()){}

Udostępnij ten post


Link to post
Share on other sites

Witam,

Jestem nowy na forum. Zaczynam przygodę z arduino !

Zadanie domowe 4.1

W skrajnej pozycji potencjometru(minimum) , dioda led delikatnie mruga. W drugiej skrajnej pozycji (max) led pali się światłem ciągłym , ale na oscyloskopie widać szpilki, które powstają z tą samą częstotliwością co mruganie leda na w pozycji potencjometru skręconego na minimum.

Jak zatem pozbyć się tego efektu ? Tak, aby led był całkowicie wyłączony lub zapalony .

Jak umieścić ten kod w pętli wewnętrznej ? Tak aby czas załączania i wyłączenia leda nie wpływał na inne pętle użyte w kodzie?

Pozdrawiam.

Udostępnij ten post


Link to post
Share on other sites

mario321, witam na forum 🙂 Pokaż swój program - łatwiej będzie znaleźć rozwiązanie.

Udostępnij ten post


Link to post
Share on other sites
unsigned long currentTime;
unsigned long currentLowTime;
unsigned long currentMillis;
unsigned long currentTimeB;
unsigned long currentLowTimeB;
unsigned long currentMillisB;
int PotPin = A2; // przypisujemy do zmiennej numer wejścia analogowego ANALOG IN - A2
int pot; // zmienna w której będziemy zapisywać "wartość" potencjometru
int zalaczanie; // zmienna w której będziemy zapisywać czas załączania 
int przerwa; // zmienna w której będziemy zapisywać czas przerwy
void setup() 
{
Serial.begin(9600);
pinMode(8, OUTPUT); 
currentMillis=millis();
currentTime=0;
currentLowTime=0;
pinMode(9, OUTPUT); 
currentMillis=millis();
currentTime=0;
currentLowTime=0;
pinMode(10, OUTPUT);
}
int isInRange(long low, long high,long val) {
if(val<low || val>high) return 0;
return 1;
}
void loop() {
Serial.println(analogRead(A0));
if(isInRange(800,1023,analogRead(A0))) {
currentLowTime=0;
currentTime+=(millis()-currentMillis);
currentMillis=millis();
if(isInRange(0,200,currentTime)) { 
digitalWrite(8, HIGH);
} else if(isInRange(200,1000,currentTime)) { 
digitalWrite(8, LOW); 
} else if(isInRange(1000,1400,currentTime)) {
digitalWrite(8, HIGH);
} else if(isInRange(1400,2000,currentTime)) {
digitalWrite(8, LOW);
} else if(isInRange(2000,2600,currentTime)){
digitalWrite(8, HIGH);
} else if(isInRange(2600,3000,currentTime)) {
digitalWrite(8, LOW);
} else if(isInRange(3000,3800,currentTime)) {
digitalWrite(8, HIGH);
} else if(isInRange(3800,4000,currentTime)) {
digitalWrite(8, LOW);
} else {
digitalWrite(8, HIGH);
} 
} else {
currentLowTime+=(millis()-currentMillis);
currentMillis=millis();
if(currentLowTime>5) {
currentTime=0;
digitalWrite(8, LOW);
}
}
{
Serial.println(analogRead(A1));
if(isInRange(800,1023,analogRead(A1))) {
currentLowTimeB=0;
currentTimeB+=(millis()-currentMillisB);
currentMillisB=millis();
if(isInRange(0,200,currentTimeB)) {
digitalWrite(9, HIGH);
} else if(isInRange(200,1000,currentTimeB)) {
digitalWrite(9, LOW);
} else if(isInRange(1000,1400,currentTimeB)) {
digitalWrite(9, HIGH);
} else if(isInRange(1400,2000,currentTimeB)) {
digitalWrite(9, LOW);
} else if(isInRange(2000,2600,currentTimeB)) {
digitalWrite(9, HIGH);
} else if(isInRange(2600,3000,currentTimeB)) {
digitalWrite(9, LOW);
} else if(isInRange(3000,3800,currentTimeB)) {
digitalWrite(9, HIGH);
} else if(isInRange(3800,4000,currentTimeB)) {
digitalWrite(9, LOW);
} else {
digitalWrite(9, HIGH);
} 
} 
else 
{
currentLowTimeB+=(millis()-currentMillisB);
currentMillisB=millis();
if(currentLowTimeB>5) {
currentTimeB=0;
digitalWrite(9, LOW);
}
}
}
{ // regulacja potencjometru
pot = analogRead(PotPin); // odczytujemy A2 i zapisujemy w zmiennej pot
if (pot > 800)
{
pot=800;
}
if (pot < 150)
{
pot=150;
}
zalaczanie = map(pot, 150, 800, 0, 100);
przerwa = map(pot, 150, 800, 100, 0);
digitalWrite(10, HIGH);
delay(zalaczanie); // przerwa zależna od położenia potencjometru
digitalWrite(10, LOW);
delay(przerwa); // przerwa zależna od położenia potencjometru
}
}

I jeśli zmieniam czas tutaj :

zalaczanie = map(pot, 150, 800, 0, 100);

przerwa = map(pot, 150, 800, 100, 0);

z 0,100 na 0,1000 i z 100, 0 na 1000, 0 to automatycznie miganie diody na pinie 10 jest wolniejsze, tak jak być powinno, ale diody na pinie 8 i 9 tracą swoją sekwencje przez zmianę czasu w załączaniu i przerwie....

Można to umieścić w pętli wewnętrznej ?(najlepiej by było gdyby był drugi loop 🙂) Tak aby zmiany czasu nie miały wpływu na pin 8 i 9 ?

I jeszcze jedno :

Kiedy skręcę potencjometr (wejscie A2 , wyjscie 10 ) na minimum to dioda lekko się błyska, zarży się na ułamek sekundy z częstotliwością taką, jaką jest zadana czasowo.

zalaczanie = map(pot, 150, 800, 0, 100);

przerwa = map(pot, 150, 800, 100, 0);

czyli :

0, 100

100,0

Natomiast kiedy skręcę potencjometr na max dioda pali się światłem ciągłym, ale na oscyloskopie widać szpilki, też dokładnie z tą samą częstotliwością jak przypadku potencjometru skręconego na minimum.

Nie chcę szpilek, ani zarżenia się diody . Jak się tego pozbyć?

Udostępnij ten post


Link to post
Share on other sites

mario321, niestety Twój program jest dość nieczytelny (brak wcięć, wybrakowane komentarze). Bardzo ciężko go analizować - nie jestem w stanie na ten moment pomóc, bo nie mam pod ręką Arduino, a analizowanie tego w głowie nie przyniesie niczego dobrego. Korzystasz też z funkcji, które nie były omawiane w kursie (milis) dlatego najlepiej będzie, jeśli w przypadku dalszych problemów założysz osobny temat, w którym opiszesz problem. Dzięki temu nie będziemy "mieszać w głowach" innym czytelnikom tego kursu. Z góry dziękuję za zrozumienie i pomoc w utrzymaniu porządku na forum 🙂

Udostępnij ten post


Link to post
Share on other sites

Cześć, mam pytanie odn. zachowania

układu - dioda włączana/wyłączana zależnie

od stanu fotorezystora i potencjometru.

Dla jasności w programie dodałem funkcję,
która wyświetla pomiary na A5 oraz A4.

W przypadku zaciemnienia fotorezystora,
odczyty z potencjometru spadały, natomiast

w odwrotnej sytuacji - rosły.

przykładowe pary:

136:680;

45:640;

670:850;

Można temu jakoś zaradzić?

Udostępnij ten post


Link to post
Share on other sites

sebastian_sl, jeśli chcesz, aby odczyty były "odwrotne" możesz zrobić to programowo lub sprzętowo. W drugim wypadku wystarczy zamienić zasilanie dzielnika napięcia: masa do fotorezystora, a 5V (Vcc) do rezystora (lub odwrotnie).

Udostępnij ten post


Link to post
Share on other sites

Witam, jako że to mój pierwszy komentarz, chciałem podziękować za kursy, które są świetne. Przeszedłem elektronikę I i dotychczasowe części Arduino z przyjemnością. Teraz przy zadaniu 4.5 napotkałem problem. Chodzi o przekazywanie liczb do Arduino przez UART. Moja filozofia jest taka że rozwiązuje zadania na bazie informacji z kursu i wydaje mi się że tym razem było ich za mało. Ostatecznie rozwiązałem problem posiłkując się kodem jednego z użytkowników, ale nie miałem pełnej satysfakcji. Stąd moja sugestia, żeby dodać do kursu coś o instrukcji/poleceniu(?) "xxx.toInt()". Kolejną nurtującą mnie rzeczą jest zastosowanie dzielnika napięcia przy fotorezystorze. Skoro jego rezystancja jest zależna od oświetlenia, to czy odczytów z ADC nie można dokonać po prostu "za" szeregowym połączeniem fotorezystora z rezystorem (bez konieczności stosowania dzielnika)?

Udostępnij ten post


Link to post
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...