Skocz do zawartości
Komentator

Kurs Arduino - #4 - Przetwornik ADC

Pomocna odpowiedź

@Treker 

Czy do zad 4.6 wykorzystanie funkcji map (), pomoże czy też wydłuży moją pracę?

Pytam bo nie chce się męczyć na marne i nie potrzebnie pójść w tą stronę.

Udostępnij ten post


Link to post
Share on other sites
Dnia 3.03.2019 o 23:54, Treker napisał:

@jogaszu teraz rozumiem. W takim razie najprościej będzie tuż po wciśnięciu przycisku odczytać wszystkie dane, które są w buforze i nic z nimi nie zrobić (tylko pobrać z bufora, aby go wyczyścić). Spróbuj pójść w tym kierunku 🙂

Hmm jako początkujący teraz ja nie do końca rozumiem. Czy jest jakieś specjalne polecenie pobrania z bufora? Czy po prostu trzeba dopisać jakąś funkcję, która zabierze dane i nic z nimi nie zrobi?

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Mam cos takiego ale dziala tylko przy okreslonych wartosciach/oswietleniu.

Wydaje mi sie ze jak sie cos we funkcjach pokombinuje to cos z tego moze byc.

Co by tu naprawic? Czy w ogole zrezygnowac z funkcji map ? 🙄

#define zolta1 13
#define zolta2 4
#define czerwona1 12
#define czerwona2 7
#define niebieska 8

int fot1=0; //Fotorezystor 1
int fot2=0; //Fotorezystor 2


void setup() 
{
  Serial.begin(9600); //Przesylanie do terminalu

  pinMode(zolta1, OUTPUT);
  pinMode(zolta2, OUTPUT);
  pinMode(czerwona1, OUTPUT);
  pinMode(czerwona2, OUTPUT);
  pinMode(niebieska,OUTPUT);

}

void loop() 
{
  Serial.print("Fotorezystor 1: ");
  Serial.println(fot1);
  Serial.print("Fotorezystor 2: ");
  Serial.println(fot2);
  delay(500);
  
  fot1=analogRead(A4);
  fot1=map(fot1, 200, 460, 1, 5);
  fot2=analogRead(A5);
  fot2=map(fot2, 230, 605, 1, 5);

  if((fot1 == 5 )&&(fot2 <= 2))
  {
    digitalWrite(zolta1, HIGH); 
    digitalWrite(czerwona1, LOW); 
    digitalWrite(niebieska, LOW); 
    digitalWrite(czerwona2, LOW); 
    digitalWrite(zolta2, LOW);
  }
  else if((fot1<=5)&&(fot2==3))
  {
    digitalWrite(zolta1, LOW); 
    digitalWrite(czerwona1, HIGH); 
    digitalWrite(niebieska, LOW); 
    digitalWrite(czerwona2, LOW); 
    digitalWrite(zolta2, LOW);
  }
  else if(fot1==fot2)
  {
    digitalWrite(zolta1, LOW); 
    digitalWrite(czerwona1, LOW); 
    digitalWrite(niebieska, HIGH); 
    digitalWrite(czerwona2, LOW); 
    digitalWrite(zolta2, LOW);
  }
  else if((fot2<=5)&&(fot1==3))
  {
    digitalWrite(zolta1, LOW); 
    digitalWrite(czerwona1, LOW); 
    digitalWrite(niebieska, LOW); 
    digitalWrite(czerwona2, HIGH); 
    digitalWrite(zolta2, LOW);
  }
  else if((fot2==5)&&(fot1<=2))
  {
    digitalWrite(zolta1, LOW); 
    digitalWrite(czerwona1, LOW); 
    digitalWrite(niebieska, LOW); 
    digitalWrite(czerwona2, LOW); 
    digitalWrite(zolta2, HIGH);
  }
}

 

00000PORTRAIT_00000_BURST20190306152141138.jpg

Edytowano przez arek2007100
zly kod

Udostępnij ten post


Link to post
Share on other sites

A co ma do tego map?

1) Nie masz obsadzonych wszystkich możliwości fot1/fot2 - konkretniej par [(1, 2), (1, 4), (2, 1), (2, 4), (4, 1), (4, 2), (4, 5), (5, 4)]

2) map nie gwarantuje, że wynik będzie ograniczony do podanego zakresu (czyli równie dobrze może być zero albo siedem).

Coś takiego:
 

fot1=map(fot1, 200, 460, 1, 5);
fot1 = constrain(fot1, 1, 5);

zagwarantuje że fot1 będzie w granicach 1 do 5 włącznie.

Pamiętaj, że constrain to makrodefinicja a nie funkcja, czyli zapis typu:

fot1 = constrain(map(fot1, 200, 460, 1, 5), 1, 5);

co prawda będzie działać, ale funkcja map może być niepotrzebnie wywołana dwukrotnie!

 

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites
Dnia 5.03.2019 o 22:28, jogaszu napisał:

Czy jest jakieś specjalne polecenie pobrania z bufora? Czy po prostu trzeba dopisać jakąś funkcję, która zabierze dane i nic z nimi nie zrobi?

Możesz wykorzystać Serial.readStringUntil('\n') lub coś innego typu Serial.read() - w tym przypadku nie będzie to miało większego znaczenia. Drugie rozwiązanie będzie bardziej uniwersalne. Tutaj znajdziesz więcej na ten temat: https://www.arduino.cc/reference/en/language/functions/communication/serial/read/

Udostępnij ten post


Link to post
Share on other sites

Witam, po pierwsze chciałbym pochwalić ten kurs, coś niesamowitego, prosty i wyrazisty 🙂 A Po drugie potrzebuje pomocy z zadaniem 4.5 😞 . Oto kod (cześciowy) niecałego zadania 4.5.

#define red 12
#define yellow 11
#define green 10
#define button 8

int odczytanaWartosc = 0;
long pobranaWartosc = 0;
int roznica = 0;
String haslo = "";
int proby = 3;

void setup(){
  for(int i = 10; i <=12 ; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i, LOW);
  }

  pinMode( button, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop(){
  Serial.println("Nastaw potencjometr i wcisnij przycisk");
  
  while(digitalRead(button) == HIGH){} //petla po to żeby nie wykonywał się kod dopóki nie zostanie naciśnięty klawisz
  
  delay(1000);//żeby nie wyłapało zakłóceń od klawisza
  
  Serial.println("Podaj liczbe:");
  
  if(Serial.available()){
    odczytanaWartosc = analogRead(A5);
    pobranaWartosc = Serial.read();
    Serial.println(pobranaWartosc);
    Serial.println(odczytanaWartosc);
    delay(5000); //po prostu opóźnienie dla mnie
  }
  }

Ale w czym problem? Na początku pojawia się na Monitorze "Nastaw potencjometr i wcisnij przycisk" i tak jak było zamierzone program czeka na wciśniecie klawisza, jednakże po jego wciśnięciu wyświetla się tylko kominukat "Podaj liczbe:" i po 5 sek od razu wykonuje ponownie pętle loop() bez pobrania wartości , co więcej nawet nie wyświetla tych wartości jaky pomijał to co jest w IF-ie. Z góry Dziękuję za pomoc 🙂 i Miłego dnia!

Udostępnij ten post


Link to post
Share on other sites
Dnia 20.03.2019 o 00:19, Majtas napisał:

Witam, po pierwsze chciałbym pochwalić ten kurs, coś niesamowitego, prosty i wyrazisty 🙂

Dziękuję za miłe słowa, cieszę się, że kurs jest pomocny 🙂

Dnia 20.03.2019 o 00:19, Majtas napisał:

Na początku pojawia się na Monitorze "Nastaw potencjometr i wcisnij przycisk" i tak jak było zamierzone program czeka na wciśniecie klawisza, jednakże po jego wciśnięciu wyświetla się tylko kominukat "Podaj liczbe:" i po 5 sek od razu wykonuje ponownie pętle loop() bez pobrania wartości , co więcej nawet nie wyświetla tych wartości jaky pomijał to co jest w IF-ie.

Program działa dokładnie tak jak go opisałeś, bo właśnie tak został napisany. Zwróć uwagę, że po wyświetleniu komunikatu proszącego o podanie liczby nie czekasz na jej wpisanie. Właściwie od razu sprawdzasz czy została podana (robisz to tak szybko, że człowiek nie ma szans wpisać wcześniej swojej propozycji). Pomyśl jak można to rozwiązać lepiej - np. za pomocą pętli while, która "opóźni" działanie programu do momentu odebrania danych 🙂

Udostępnij ten post


Link to post
Share on other sites

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ę »

×