27-01-2024, 23:47
Witajcie,
moje pytanie dotyczy ogólnie pisania kodu w Arduino IDE, a może nawet ogólnie w C++
Do tej pory różne programy, które pisałem na Arduino bywały większe lub mniejsze, ale zawsze w jednym "pliku" - i wszystko grało.
Ostatnio, jako że stałem się posiadaczem niewielkiego morskiego jachtu żaglowego, postanowiłem zbudować taki system "Smart Boat". Będzie tam sporo czujników - napięcia w akumulatorach, ciśnienia, temperatur w kilku miejscach, obrotów silnika i śruby, poziomu wody, paliwa itp. Całość podzielona na serce - czyli Arduino Mega oraz dwa arduino Nano - jedno obsługujące aku i zbiorniki, drugie silnik. Komunikacja między nimi będzie po USART. I poszczególne elementy sa już zbudowane.
Ostatnio zabrałem się za zebranie tych "modułów" do kupy i napotkałem pewien problem programistyczny, który nie wiem jak "ugryźć" - mianowicie nie wyobrażam sobie, jak to miało by być pisane w jednym pliku. Jeszcze praktycznie nic nie jest uruchomione, a już jest to niemal 1000 linijek kodu. No to funkcje out. I tu moje zaskoczenie - bo tego kompletnie nie rozumiem. Poszczególne funkcje, które w nagłówku są dołączone do głównego programu (pliki *.cpp i *.h) nie widzą zmiennych globalnych, nie są w stanie odwoływać się do wyświetlacza itd itp.
Do tej pory wydawało mi się, że własne funkcje dodane w nagłówku sa niejako "wklejane" w kod programu w miejscu ich wywołania i dopiero wówczas kompilator i debuger zabierają się do pracy. A tu niespodzianka. Jak powinno się prawidłowo podejść do tematu?
Taki przykład kodu głównego
Następnie plik "stronyMenu.h
Oraz "stronyMenu.cpp"
Kompilator zaś wypluwa tak:
Jak rozumiem - funkcje z osobnego pliku nie są przed kompilacją dodawane do głównego programu, bo "nie widzą" istniejącego już obiektu lcd i nie potrafią się do niego odwołać...
Przepraszam, jeśli moje tłumaczenie jest zawiłe, lub problem okaże się trywialny, ale z zawodu nie jestem programistą... I z góry dzięki za porady!
moje pytanie dotyczy ogólnie pisania kodu w Arduino IDE, a może nawet ogólnie w C++
Do tej pory różne programy, które pisałem na Arduino bywały większe lub mniejsze, ale zawsze w jednym "pliku" - i wszystko grało.
Ostatnio, jako że stałem się posiadaczem niewielkiego morskiego jachtu żaglowego, postanowiłem zbudować taki system "Smart Boat". Będzie tam sporo czujników - napięcia w akumulatorach, ciśnienia, temperatur w kilku miejscach, obrotów silnika i śruby, poziomu wody, paliwa itp. Całość podzielona na serce - czyli Arduino Mega oraz dwa arduino Nano - jedno obsługujące aku i zbiorniki, drugie silnik. Komunikacja między nimi będzie po USART. I poszczególne elementy sa już zbudowane.
Ostatnio zabrałem się za zebranie tych "modułów" do kupy i napotkałem pewien problem programistyczny, który nie wiem jak "ugryźć" - mianowicie nie wyobrażam sobie, jak to miało by być pisane w jednym pliku. Jeszcze praktycznie nic nie jest uruchomione, a już jest to niemal 1000 linijek kodu. No to funkcje out. I tu moje zaskoczenie - bo tego kompletnie nie rozumiem. Poszczególne funkcje, które w nagłówku są dołączone do głównego programu (pliki *.cpp i *.h) nie widzą zmiennych globalnych, nie są w stanie odwoływać się do wyświetlacza itd itp.
Do tej pory wydawało mi się, że własne funkcje dodane w nagłówku sa niejako "wklejane" w kod programu w miejscu ich wywołania i dopiero wówczas kompilator i debuger zabierają się do pracy. A tu niespodzianka. Jak powinno się prawidłowo podejść do tematu?
Taki przykład kodu głównego
Kod:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
#include "stronyMenu.h"
byte menuPage = 0;
void setup()
{
lcd.backlight();
lcd.noCursor();
lcd.init();
lcd.setCursor(0,5);
lcd.print("s/y Sirius");
}
void loop() {
switch(menuPage)
{
case 0:
menuZero();
break;
case 1:
menuOne();
break;
}
}
Następnie plik "stronyMenu.h
Kod:
#ifndef STRONYMENU_H
#define STRONYMENU_H
void menuZero();
void menuOne();
#endif
Oraz "stronyMenu.cpp"
Kod:
#include "stronyMenu.h"
void menuZero()
{
lcd.setCursor(0,2);
lcd.print("Menu glowne");
//dalsza część tego menu
}
void menuOne()
{
lcd.setCursor(0,2);
lcd.print("Menu silnik");
//dalsza część tego menu
}
Kompilator zaś wypluwa tak:
Cytat:C:\Users\{...}\stronyMenu.cpp: In function 'void menuZero()':
C:\Users\{...}\stronyMenu.cpp:5:3: error: 'lcd' was not declared in this scope
lcd.setCursor(0,2);
^~~
C:\Users\{...}\stronyMenu.cpp: In function 'void menuOne()':
C:\Users\{...}\stronyMenu.cpp:12:3: error: 'lcd' was not declared in this scope
lcd.setCursor(0,2);
^~~
exit status 1
Compilation error: 'lcd' was not declared in this scope
Jak rozumiem - funkcje z osobnego pliku nie są przed kompilacją dodawane do głównego programu, bo "nie widzą" istniejącego już obiektu lcd i nie potrafią się do niego odwołać...
Przepraszam, jeśli moje tłumaczenie jest zawiłe, lub problem okaże się trywialny, ale z zawodu nie jestem programistą... I z góry dzięki za porady!