Liczba postów: 6
Liczba wątków: 2
Dołączył: Jan 2020
Reputacja:
0
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?
Liczba postów: 356
Liczba wątków: 5
Dołączył: Aug 2019
Reputacja:
28
07-01-2020, 21:40
(Ten post był ostatnio modyfikowany: 07-01-2020, 21:41 przez Agregacik.)
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ć.
Liczba postów: 6
Liczba wątków: 2
Dołączył: Jan 2020
Reputacja:
0
07-01-2020, 22:07
(Ten post był ostatnio modyfikowany: 07-01-2020, 22:10 przez lgema.)
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);
}"
Liczba postów: 296
Liczba wątków: 0
Dołączył: Aug 2019
Reputacja:
8
08-01-2020, 01:06
(Ten post był ostatnio modyfikowany: 08-01-2020, 05:18 przez semi.)
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/.
Liczba postów: 884
Liczba wątków: 19
Dołączył: Jun 2018
Reputacja:
43
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ą.
Liczba postów: 356
Liczba wątków: 5
Dołączył: Aug 2019
Reputacja:
28
08-01-2020, 09:00
(Ten post był ostatnio modyfikowany: 08-01-2020, 09:01 przez Agregacik.)
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.
Liczba postów: 654
Liczba wątków: 3
Dołączył: Apr 2017
Reputacja:
51
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.
Liczba postów: 356
Liczba wątków: 5
Dołączył: Aug 2019
Reputacja:
28
08-01-2020, 12:02
(Ten post był ostatnio modyfikowany: 08-01-2020, 12:02 przez Agregacik.)
@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.