Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

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 + "!"); 
      }
   }       
}

Link do komentarza
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.

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,

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.

Link do komentarza
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ć?

Link do komentarza
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 🙂

Link do komentarza
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ć?

Link do komentarza
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).

Link do komentarza
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)?

Link do komentarza
Share on other sites

RC95, witam na forum, dziękuję za miłe słowa! Faktycznie w tej części nie ma informacji o xxx.toInt(), pierwotnie zamysł był taki, aby zmusić czytelników do szukania i główkowania 😉 Jeszcze zostawię to w takiej formie, jeśli pojawi się więcej problemów, to zrobię stosowną aktualizację.

Niestety nie wiem jak dokładnie chciałbyś inaczej podłączyć fotorezystor. W końcu dzielnik napięcia, to tak naprawdę szeregowe połączenie dwóch rezystorów. Nie rozumiem gdzie dokładnie chciałbyś dokonywać pomiaru. Spróbuj przerysować sobie schemat - może wtedy wszystko się rozjaśni.

Link do komentarza
Share on other sites

Treker Przydało by się poprawić w kursie to co Pakos napisał.

Wybacz, że to piszę ale chwilę się męczyłem niczym doszedłem to tego co Pakos.

Już myślałem że uszkodziłem Arduino.

Mam kilka uwag do funkcji map(). W artykule zwracasz uwagę, że poprawne działanie "Wskaźnik na diodach" uzyskałeś zmieniając wartość z 1023 na 1021. Zgodnie z kodem funkcji map()
long map(long x, long in_min, long in_max, long out_min, long out_max)
{
 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

dla map(x, 0, 1023, 1, 5); piaty warunek zachodzi tylko gdy x=1023. Czyli sygnał analogowy podzielony jest na 4 przedziały i wystąpienie wartości max. Lepsze działanie kodu uzyskamy poprzez:

map(x, 0, 1023, 0, 5);

i zmieniając warunki lub

map(x, 0, 1023, 1, 6);
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.