Библиотека. Или я глючЮ. Помощь.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Всем привет !

пытаюсь изучить создание библиотеки. Объект - светодиод. Создание объекта - два параметра, 1 - пин, 2 - подмигнуть или подугаснуть. Процедура - в зависимости от параметра 2 при создании объекта - включить СД или погасить его на указанное в процедуре время.

головной :

==================================================================

#ifndef RomaLCD_h
#define RomaLCD_h
 
#include "Arduino.h"
 
class RomaLCD
{
public:
    RomaLCD( int LCDPin , int FrontTImpuls );
    int LCDPin();
    unsigned int TImpuls();
    int FrontTImpuls();
    void blinkLCD( unsigned int TImpuls );
private:
    int _LCD_Pin;
    unsigned int _TImpuls;
    int _FrontTImpuls;
};
 
#endif
==================================================================
 
реализация :
 
==================================================================
#include "Arduino.h"
#include "RomaLCD.h"
 
RomaLCD::RomaLCD( int LCDPin , int FrontTImpuls )
{
  _LCDPin = LCDPin;
  _FrontTImpuls = FrontTImpuls;
  pinMode( _LCDPin , OUTPUT );
  digitalWrite( _LCDPin , ! _FrontTImpuls );
}
 
void RomaLCD::blinkLCD( unsigned int TImpuls )
{
  unsigned int _TImpuls  = TImpuls ;
  digitalWrite( _LCDPin , _FrontTImpuls );
  unsigned long TNow = millis( );
  if ( ( millis( ) - TNow ) > _TImpuls )
    {
      digitalWrite( _LCDPin , ! _FrontTImpuls );
    }
}
==================================================================
 
скетч :
 
==================================================================
#include <RomaLCD.h>
  
void setup( )
{
  RomaLCD LCD_0( 8 , 1 );
}
 
void loop( )
{
  LCD_0.blinkLCD( 500 );
}
==================================================================
 
ругательства скетча :
==================================================================
 
Roma_LCD_Lib.cpp: In function 'void loop()':
Roma_LCD_Lib:9: error: 'LCD_0' was not declared in this scope

==================================================================

где я накосячил - подскажите пожста....

toly
Offline
Зарегистрирован: 17.05.2014

Почитайте про область видимости объектов в C++...декларацию LCD_0 нужно вытащть их setup наружу...

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

дык, два варианта - сетап и луп.... видимость с дельфов знаю... прямо подскажите ? :)-

toly
Offline
Зарегистрирован: 17.05.2014
#include <RomaLCD.h>
 
RomaLCD LCD_0( 8 , 1 );

void setup( )

{

}

void loop( )

{
  LCD_0.blinkLCD( 500 );
}

третий вариант - не сетап и не луп

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

тоже пробовал, но не озвучил....

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

на это ругается так :

D:\Program Files\Roma_Arduino\arduino-1.0-windows\arduino-1.0\libraries\RomaLCD\RomaLCD.cpp: In constructor 'RomaLCD::RomaLCD(int, int)':
D:\Program Files\Roma_Arduino\arduino-1.0-windows\arduino-1.0\libraries\RomaLCD\RomaLCD.cpp:6: error: '_LCDPin' was not declared in this scope
D:\Program Files\Roma_Arduino\arduino-1.0-windows\arduino-1.0\libraries\RomaLCD\RomaLCD.cpp: In member function 'void RomaLCD::blinkLCD(unsigned int)':
D:\Program Files\Roma_Arduino\arduino-1.0-windows\arduino-1.0\libraries\RomaLCD\RomaLCD.cpp:15: error: '_LCDPin' was not declared in this scope
toly
Offline
Зарегистрирован: 17.05.2014

_LCDPin и _LCD_Pin - это разные имена

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

ругается только на файлы библиотеки.... и там всё менял по разному :(

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

toly пишет:

_LCDPin и _LCD_Pin - это разные имена

оооооой, щас проверю... спасибо !

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

а ИДЕ надо перезагружать после правки библы ?

и ещё - как сделать чёбы не было возврата в луп пока не закончится выполняться процедура объекта вызванная библой ? может не так спросил ? :(

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

СПАСИБО ! в либе убрал всего-то одно подчёркивание.... компилируется ! платы нетс собом, потом проверю....

про ИДЕ и правку библы - понял - не надо перезагружать...

а второй вопрос - остался.... подскАжите ?

как сделать чёбы не было возврата в луп пока не закончится выполняться процедура объекта вызванная библой ? может не так спросил ? :( ....как у серв... пока не выйдет на заданное положение - дальнейшие строки скетча не выполняются....

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

спасибо, toly ! буду ждать....

zhenious
Offline
Зарегистрирован: 03.07.2014

SU-27-16 пишет:

и ещё - как сделать чёбы не было возврата в луп пока не закончится выполняться процедура объекта вызванная библой ? может не так спросил ? :(

Так ничего и не надо делать, выполнение скетча дальше не продвинется, пока не выполнится текущий метод. Это ведь микроконтроллер, здесь нет многопоточности. Обычное линейное выполнение команд

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

zhenious пишет:
Это ведь микроконтроллер, здесь нет многопоточности. Обычное линейное выполнение команд


не обобщайте.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
#include <RomaLCD.h>
RomaLCD LCD_0( 13 , 1 );
void setup( )
{ }
void loop( )
{
  LCD_0.blinkLCD( 100 );
  delay( 750 );
  LCD_0.blinkLCD( 200 );
  delay( 750 );  
}

*****************************************************************************

#ifndef RomaLCD_h
#define RomaLCD_h

#include "Arduino.h"

class RomaLCD
{
public:
    RomaLCD( byte LCDPin , byte FrontTImpuls );
    byte LCDPin();
    unsigned int TImpuls();
    byte FrontTImpuls();
    void blinkLCD( unsigned int TImpuls );
private:
    byte _LCDPin;
    unsigned int _TImpuls;
    byte _FrontTImpuls;
};

#endif

*****************************************************************************

#include "Arduino.h"
#include "RomaLCD.h"

RomaLCD::RomaLCD( byte LCDPin , byte FrontTImpuls )
{
  _LCDPin = LCDPin;
  _FrontTImpuls = FrontTImpuls;
  pinMode( LCDPin , OUTPUT );
  digitalWrite( LCDPin , ! _FrontTImpuls );
}

void RomaLCD::blinkLCD( unsigned int TImpuls )
{
  unsigned int _TImpuls  = TImpuls ;
  digitalWrite( _LCDPin , _FrontTImpuls );
  unsigned long TNow = millis( );
  while ( ( millis( ) - TNow ) < _TImpuls )
  {  }
  digitalWrite( _LCDPin , ! _FrontTImpuls );
}

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

всё заработало.... и при 0, и при 1 во втором параметре в строке 2

задежка от выхода из метода - строки 54, 55

всем спасибо :)