• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Deklarowanie/inicjalizacja pinów Wemos w Arduino IDE?
#1
Witam, chciałem dopytać jak to jest z prawidłową deklaracją pinów - skąd mam wiedzieć, że np. 
taki zapis "int pin_pomiarowy = 0" deklaruje pin analogowy A0, a nie cyfrowy D0?
Dodam, że w moim przypadku używam płytki Wemos D1 mini, a jakby to było np. dla Arduino Nano?
 
Odpowiedź
#2
Zapis "int pin_pomiarowy = 0" deklaruje zmienną o nazwie "pin_pomiarowy", która może przybierać wartości "int" zależne od procesora i w tej chwili wstępnie przypisuje się jej wartość "0".
Deklarację pinu np A0 robi się tak "#define pin_pomiarowy A0" a pinu D0 tak "#define pin_pomiarowy 0" .
Jak się mylę lub można inaczej, to proszę mnie poprawić, uzupełnić.
 
Odpowiedź
#3
OK, to może zapytam inaczej, poniżej wklejam kod przykładowego programu obsługującego sensor GP2Y1010AU0F - program obsługuje dwa piny (A0 i D2), ale moje pytanie brzmi skąd Arduino IDE wie, że 0 to pin A0, a 2 to pin D2?

"
int measurePin = 0; //Connect dust sensor to Arduino A0 pin
int ledPower = 2;  //Connect 3 led driver pins of dust sensor to Arduino D2

int samplingTime = 280;
int deltaTime = 40;
int sleepTime = 9680;

float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;

void setup(){
  Serial.begin(9600);
  pinMode(ledPower,OUTPUT);
}

void loop(){
  digitalWrite(ledPower,LOW); // power on the LED
  delayMicroseconds(samplingTime);

  voMeasured = analogRead(measurePin); // read the dust value

  delayMicroseconds(deltaTime);
  digitalWrite(ledPower,HIGH); // turn the LED off
  delayMicroseconds(sleepTime);

  // 0 - 5V mapped to 0 - 1023 integer values
  // recover voltage
  calcVoltage = voMeasured * (5.0 / 1024.0);

  // Chris Nafis © 2012
  dustDensity = 170 * calcVoltage - 0.1;

 
  Serial.println(dustDensity); // unit: ug/m3

  delay(1000);
}"
 
Odpowiedź
#4
int measurePin = 0;
int ledPower = 2;

analogRead(measurePin)
i
pinMode(ledPower,OUTPUT);
digitalWrite(ledPower,LOW);
digitalWrite(ledPower,HIGH)

już widzisz skąd "wie"?


PS
Czy ktoś rozwikła zagadkę? Dlaczego piny, których nie ma więcej niż 256, deklarowane są typem 16-biot ze znakiem? Dlaczego to zmienna a nie stała?
Plaga jakiaś czy co?
Za dużo FLASH i RAM w AVR?
Za szybki CPU?
Trudne zagadnienia w przystępny sposób - praktyczny kurs Arduino w Elektronice dla Wszystkich https://elportal.pl/.
 
Odpowiedź
#5
No nie do końca, o ile ktoś wie jak używać numeracji jaki jest jego zakres to jeszcze będzie działać, ale jak ktoś zrobi błąd to takie deklaracje stworzą problem a autor będzie dochodził dlaczego nie działa..

int measurePin = 0; wystarczy dać 8 i mamy problemy... Bo nie ma PC8 a komplikator o tym nie wie i przepuści...
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#6
Czyli deklarowanie pinów za pomocą zmiennej to rozrzutność, bo zajmujemy niepotrzebnie pamięć, której jest i tak nie za dużo a ponadto może stwarzać problemy. Czyli "programiści" do "D". Można na sztywno wpisywać np A0 , A7 , 8, 5 itd no, ale to stwarza problemy przy rozbudowanym programie, jak trzeba zmienić któryś pin bo nie pasuje nam przy projektowaniu płytki itp.
 
Odpowiedź
#7
Dla tego wymyślono preprocesor, oraz jego dyrektywy.
Na przykład dyrektywa #define measurePin 0 spowoduje, że preprocesor w każdym wystąpieniu słowa measurePin, zamieni je na liczbę 0.
A skąd kompilator wie, że 0 to to samo co A0?
Oczywiście nie wie. Dopiero użycie liczby 0 w funkcji  voMeasured = analogRead(measurePin); spowoduje, że do zmiennej voMeasured wpisana zostanie wartość z ADC0. Więcej można się dowiedzieć studiując plik pins_arduino.h (popatrz na stałą digital_pin_to_bit_mask_PGM[])
Jeżeli chcesz czytać stan pinu A0, to już nie możesz napisać digitalRead(0), tylko digitalRead(A0), lub zamiast zmiennej łańcuchowej można napisać digitalRead(14).
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#8
(08-01-2020, 07:00)Jarewa0606 napisał(a): int measurePin = 0;  wystarczy dać 8 i mamy problemy...  Bo nie ma PC8 a komplikator  o tym nie wie i przepuści...
Jaki problem? Osiem to więcej niż bajt? Jeśli nawet byłoby więcej, to kompilator da ostrzeżenie (kto je czyta?).

(08-01-2020, 07:00)Jarewa0606 napisał(a): Bo nie ma PC8 a komplikator o tym nie wie i przepuści...
Co ma PCB do rezultatu kompilacji?

(08-01-2020, 09:00)Agregacik napisał(a): Czyli deklarowanie pinów za pomocą zmiennej to rozrzutność, bo zajmujemy niepotrzebnie pamięć, której jest i tak nie za dużo a ponadto może stwarzać problemy. Czyli "programiści" do "D".
Dokładnie tak. Lepiej bym tego nie ujął.

(08-01-2020, 09:00)Agregacik napisał(a): ale to stwarza problemy przy rozbudowanym programie, jak trzeba zmienić któryś pin bo nie pasuje nam przy projektowaniu płytki itp.
Jakie problemy? Co za problem zmienić
#define PORT_OUT 3
na np
#define PORT_OUT 10
?
Gdzie trudność? ja nie widzę?
Trudne zagadnienia w przystępny sposób - praktyczny kurs Arduino w Elektronice dla Wszystkich https://elportal.pl/.
 
Odpowiedź
#9
@semi rozchodziło mi się o przypadek, gdy nie definiujemy na początku #define PORT_OUT 10 tylko za każdym razem w programie piszemy np digitalRead(10), bo przecież tak można.
 
Odpowiedź
#10
(08-01-2020, 12:02)Agregacik napisał(a): @semi rozchodziło mi się o przypadek, gdy nie definiujemy na początku #define PORT_OUT 10 tylko za każdym razem w programie piszemy np digitalRead(10), bo przecież tak można.
Mnie takie rozwiązanie nie przyszło by nigdy do głowy.
Gdy jakiś parametr występuje w kodzie więcej niż jeden raz staje się stałą lub definicją. Dopisze do listy grzechów Arduinowców. Aktualna wersja robocza w załączniku. Jak widać ciągle rośnie.


Załączone pliki
.pdf   10 grzechow glownych poczatkujacych arduinowcow.pdf (Rozmiar: 49.23 KB / Pobrań: 4)
Trudne zagadnienia w przystępny sposób - praktyczny kurs Arduino w Elektronice dla Wszystkich https://elportal.pl/.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości