Skocz do zawartości

Pomocna odpowiedź

  • 1 miesiąc później...

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

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.

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

while(!Serial.available()){}
  • 2 tygodnie później...

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.

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ć?

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 🙂

  • 2 tygodnie później...

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ć?

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).

  • 1 miesiąc później...

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)?

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.

  • 1 miesiąc później...

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);

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...