Arduino Polska Forum
Deklarowanie/inicjalizacja pinów Wemos w Arduino IDE? - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica)
+--- Wątek: Deklarowanie/inicjalizacja pinów Wemos w Arduino IDE? (/watek-deklarowanie-inicjalizacja-pin%C3%B3w-wemos-w-arduino-ide)

Strony: 1 2 3


Deklarowanie/inicjalizacja pinów Wemos w Arduino IDE? - lgema - 07-01-2020

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?


RE: Deklarowanie/inicjalizacja pinów Wemos w Arduino IDE? - Agregacik - 07-01-2020

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


RE: Deklarowanie/inicjalizacja pinów Wemos w Arduino IDE? - lgema - 07-01-2020

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


RE: Deklarowanie/inicjalizacja pinów Wemos w Arduino IDE? - semi - 08-01-2020

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?


RE: Deklarowanie/inicjalizacja pinów Wemos w Arduino IDE? - Jarewa0606 - 08-01-2020

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


RE: Deklarowanie/inicjalizacja pinów Wemos w Arduino IDE? - Agregacik - 08-01-2020

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.


RE: Deklarowanie/inicjalizacja pinów Wemos w Arduino IDE? - Robson Kerman - 08-01-2020

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


RE: Deklarowanie/inicjalizacja pinów Wemos w Arduino IDE? - semi - 08-01-2020

(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ę?


RE: Deklarowanie/inicjalizacja pinów Wemos w Arduino IDE? - Agregacik - 08-01-2020

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


RE: Deklarowanie/inicjalizacja pinów Wemos w Arduino IDE? - semi - 08-01-2020

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