2009-11-14 23 views
27

के साथ कक्षाओं का उपयोग करना मैं Arduino के साथ कक्षा वस्तुओं का उपयोग करने की कोशिश कर रहा हूं, लेकिन मैं समस्याओं में भाग रहा हूं। मैं बस एक वर्ग घोषित करना चाहता हूं और उस वर्ग का एक वस्तु बनाना चाहता हूं। एक उदाहरण क्या होगा?Arduino

उत्तर

1

क्या आप एक उदाहरण प्रदान कर सकते हैं जो काम नहीं करता है? जैसा कि आप शायद जानते हैं, Wiring language सी/सी ++ पर आधारित है, हालांकि not all of C++ is supported

चाहे आपको वायरिंग आईडीई में कक्षाएं बनाने की अनुमति है, मुझे यकीन नहीं है (मेरा पहला Arduino अभी मेल में है)। मुझे पता है कि अगर आपने सी ++ वर्ग लिखा है, तो इसे AVR-GCC का उपयोग करके संकलित किया गया है, फिर इसे AVRDUDE का उपयोग करके अपने Arduino पर लोड किया गया, यह काम करेगा।

3

मैंने थोड़ी देर पहले यह सरल बनाया था। मेरा मुख्य चुनौती एक अच्छा निर्माण वातावरण बनाना था - एक मेकफ़ाइल जो जीयूआई का उपयोग किए बिना सबकुछ संकलित और लिंक/तैनात करेगी।

class AMLed 
{ 
    private: 
      uint8_t _ledPin; 
      long _turnOffTime; 

    public: 
      AMLed(uint8_t pin); 
      void setOn(); 
      void setOff(); 
      // Turn the led on for a given amount of time (relies 
      // on a call to check() in the main loop()). 
      void setOnForTime(int millis); 
      void check(); 
}; 

यहाँ और मुख्य स्रोत

AMLed::AMLed(uint8_t ledPin) : _ledPin(ledPin), _turnOffTime(0) 
{ 
    pinMode(_ledPin, OUTPUT); 
} 

void AMLed::setOn() 
{ 
    digitalWrite(_ledPin, HIGH); 
} 

void AMLed::setOff() 
{ 
    digitalWrite(_ledPin, LOW); 
} 

void AMLed::setOnForTime(int p_millis) 
{ 
    _turnOffTime = millis() + p_millis; 
    setOn(); 
} 

void AMLed::check() 
{ 
    if (_turnOffTime != 0 && (millis() > _turnOffTime)) 
    { 
     _turnOffTime = 0; 
     setOff(); 
    } 
} 

यह अधिक सुंदरता से यहां प्रारूप में है: कोड के लिए, यहाँ शीर्ष लेख है http://amkimian.blogspot.com/2009/07/trivial-led-class.html

का उपयोग करने के लिए, मैं बस में कुछ इस तरह करते हैं .pde फ़ाइल:

#include "AM_Led.h" 

#define TIME_LED 12 // The port for the LED 

AMLed test(TIME_LED); 
+1

कैसे आप किसी अन्य समारोह के लिए एक पैरामीटर के रूप 'test' पारित होगा? इस तरह के वर्ग के लिए फ़ंक्शन हस्ताक्षर कैसा दिखता है? आप 'नया एएमएलएड (TIME_LED)' का उपयोग नहीं कर रहे हैं, तो 'एएमएल परीक्षण (TIME_LED)' कैसे दिखाई देगा? मैं पूछ रहा हूं क्योंकि मेरे पास दो ऑब्जेक्ट हैं, दोनों प्रकार 'एएमएलएड' हैं, और मैं उन्हें एक फ़ंक्शन में संदर्भित करना चाहता हूं। –

12

an excellent tutorial on how to create a library for the Arduino platform है। एक पुस्तकालय मूल रूप से एक वर्ग है, इसलिए यह आपको दिखाएगा कि यह सब कैसे किया जाता है।

Arduino पर आप वर्गों का उपयोग कर सकते है, लेकिन वहाँ कुछ प्रतिबंध हैं:

  • कोई नई और कीवर्ड्स
  • कोई अपवाद
  • नहीं libstdC++, इसलिए कोई मानक काम करता है, टेम्पलेट्स या वर्गों
  • हटाना

आपको अपनी कक्षाओं के लिए नई फाइलें भी बनाने की ज़रूरत है, आप उन्हें अपने मुख्य स्केच में घोषित नहीं कर सकते हैं। लाइब्रेरी को पुन: संकलित करते समय आपको Arduino IDE को बंद करने की आवश्यकता होगी। यही कारण है कि मैं ग्रहण का उपयोग अपने Arduino IDE के रूप में करता हूं।

+7

नया/डिलीट Arduino 1.0.6 –

1

मेरा Webduino library सभी एक सी ++ कक्षा पर आधारित है जो Arduino ईथरनेट ढाल के शीर्ष पर एक वेब सर्वर लागू करता है। मैंने पूरे वर्ग को .h फ़ाइल में परिभाषित किया है कि कोई भी Arduino कोड # शामिल कर सकता है। यह देखने के लिए कोड को देखने के लिए स्वतंत्र महसूस करें कि मैं इसे कैसे करता हूं ... मैंने इसे सभी इनलाइन परिभाषित कर दिया क्योंकि Arduino IDE के साथ वस्तुओं को अलग-अलग संकलित करने का कोई वास्तविक कारण नहीं है।

0

this page पर, आर्डिनो स्केच कुछ स्ट्रक्चर (साथ ही कुछ विधियों) को परिभाषित करता है जिन्हें बाद में सेटअप लूप और मुख्य पाश में बुलाया जाता है। मेरे जैसे मुश्किल-साक्षर प्रोग्रामर के लिए भी व्याख्या करने के लिए पर्याप्त सरल है।

4

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1230935955 कहता है:

डिफ़ॉल्ट रूप से, Arduino आईडीई और पुस्तकालयों ऑपरेटर नए और ऑपरेटर को नष्ट उपयोग नहीं करता। यह समर्थन malloc() और मुक्त() करता है। तो समाधान इन फ़ंक्शंस का उपयोग करने के लिए, नए और स्वयं को ऑपरेटरों को हटाने के लिए लागू करना है।

कोड:

#include <stdlib.h> // for malloc and free 
void* operator new(size_t size) { return malloc(size); } 
void operator delete(void* ptr) { free(ptr); } 

यह आइए आपके द्वारा बनाए गए वस्तुओं, जैसे

C* c; // declare variable 
c = new C(); // create instance of class C 
c->M(); // call method M 
delete(c); // free memory 

सादर,

16

tamberg Arduino 1.0 पर, यह ठीक संकलित:

class A 
{ 
    public: 
    int x; 
    virtual void f() { x=1; } 
}; 

class B : public A 
{ 
    public: 
    int y; 
    virtual void f() { x=2; } 
}; 


A *a; 
B *b; 
const int TEST_PIN = 10; 

void setup() 
{ 
    a=new A(); 
    b=new B(); 
    pinMode(TEST_PIN,OUTPUT); 
} 

void loop() 
{ 
    a->f(); 
    b->f(); 
    digitalWrite(TEST_PIN,(a->x == b->x) ? HIGH : LOW); 
} 
+0

पर ठीक है, ध्यान दें, मेरे पास वर्चुअल विनाशक नहीं है --- गतिशील वस्तुओं का निर्माण ठीक लगता है, लेकिन विलोपन विखंडन का कारण बन सकता है, इसलिए मुझे विश्वास नहीं है कि यह एक अच्छा विचार है अपने पर्यावरण को गतिशील रूप से कॉन्फ़िगर करने से अधिक करें। –