首页 > 解决方案 > Arduino 使用 Visual Studio 在另一个库中包含一个库

问题描述

大家好,我的项目需要帮助。

我不明白如何将一个库包含到我为我的项目构建的另一个库中。我正在编写一个库 Encoders.h 能够控制我的编码器的运动和按钮点击。为了阅读机芯,我使用了著名的 Encoder.h 库,您可以在此处找到。

这是我的代码

编码器.h

#ifndef ENCODER_h
#define ENCODER_h

#include <Arduino.h>
#include <Timer.h>
#include <joyconf.h>


#include <Encoder.h>


class Encoders_ {
    private:
        // one encoder input 
        int _clk;
        // the other encoder input
        int _dt;
        // click push button
        int _sw;

        // read state of sw
        int _sw_read;
        
        // last sw state
        int _sw_last_state;

        // current state encoder pin A
        int _current_clk;

        // current state encoder pin B
        int _current_dt;

        // last state pin A
        int _last_clk;

        // last state pin B
        int _last_dt;

        // last direction state
        int _last_res;

        //last saved direction result
        int _res;

        //ready to encode?
        int _ready;

        // timer class to debounce clicks
        Timer_ _Timer1;
        // timer class to debounce directions
        Timer_ _Timer2;

        // set pinA and pinB in the external lib
        Encoder _Myenc(uint8_t pina, uint8_t pinb);

        //Encoder _Myenc;
        
    public:

        
        
        /**
         * to initialize the encoder with input pins and click pin.
         * All af them are digital inputs.
         */
        Encoders_(int clk, int dt, int sw);

        /**
         * give the direction (one step change)
         * 
         * @param how long time give the same output before reset to 0 output 
         * 
         * @return 1 if clockwise (right) or 0 if no changes or -1 if anticlock-wise (left)
         */
        int direction(long out_t);

        /**
         * return the SW push button state. It is debounced to avoid false clicks.
         * Please check the mechanical condition of every encoder.
         * Some encoder can need longer delay.
         * 
         * @param long deboucing time
         * 
         * @return int 0 LOW (clicked) or 1 HIGH (released).
         */ 
        int click(long deb_time);

        /**
         * return the last direction state of the encoder
         * 
         * @return int 1 (right), -1 (left).
         */ 
        int lastState();
};

#endif

编码器.cpp

#include <Encoders.h>
#include <Encoder.h>



Encoders_::Encoders_(int clk, int dt, int sw){

  _Myenc(clk,dt);

  _clk = clk;
  _dt = dt;
  _sw = sw;

  _last_clk = HIGH;
  _last_dt = HIGH;

  _current_clk = HIGH;
  _current_dt = HIGH;

  _sw_last_state = HIGH;

  _last_res = 0;

  _ready = 0;
}

int Encoders_::direction(long out_t){
  

  long newPosition = _Myenc.read();
  
  newPosition;
}

int Encoders_::click(long deb_time){

    
  // read the state of the switch into a local variable:
  // normal open state is HIGH
  _sw_read = digitalRead(_sw);

  /*if(_sw_read) Serial.println("HIGH");
  else Serial.println("LOW");*/
  
  /*save the state before timer check to not stuck on a
  specific state*/
  _sw_last_state = _sw_read;

  //Serial.println(_sw_last_state);

  if(_Timer1.expired(deb_time)){
    _Timer1.update();
    if (!_sw_read){
      return 0;
    } else {
      return 1;
    } 
  }

  
  return _sw_last_state;
}

int Encoders_::lastState(){
  return _res;
}

请注意,带有“s”的编码器是我的库,没有“s”的是外部库。

long newPosition = Myenc.read();我收到错误“'Myenc' 未在此范围内声明”“表达式必须具有类类型”

我不明白如何包含编码器库并使用两个参数对其进行初始化。我遵循与 Timer.h 库相同的逻辑,但不一样(在 Timer_ 中,我的构造函数为空,这使一切变得简单)

非常感谢你帮助我。

标签: c++arduino

解决方案


_Myenc是一个函数,而不是一个对象。您可能打算写_Myenc().read()而不是_Myenc.read();.


推荐阅读