Quantcast
Channel: Arduino Polska Forum - Wszystkie działy
Viewing all articles
Browse latest Browse all 256

Podział dużego projektu

$
0
0
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
Kod:
#include &tWire.h&t
#include &tLiquidCrystal_I2C.h&t

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!

Viewing all articles
Browse latest Browse all 256

Trending Articles


TRX Antek AVT - 2310 ver 2,0


Автовишка HAULOTTE HA 16 SPX


POTANIACZ


Zrób Sam - rocznik 1985 [PDF] [PL]


Maxgear opinie


BMW E61 2.5d błąd 43E2 - klapa gasząca a DPF


Eveline ➤ Matowe pomadki Velvet Matt Lipstick 500, 506, 5007


Auta / Cars (2006) PLDUB.BRRip.480p.XviD.AC3-LTN / DUBBING PL


Peugeot 508 problem z elektroniką


AŚ Jelenia Góra