Arduino使用Visual Studio在另一个库中包含一个库

问题描述

嗨,我需要my project方面的帮助。

我不知道如何将一个库包含到我正在为项目构建的另一个库中。我正在编写一个库Encoders.h,它可以控制编码器的移动和单击按钮。要阅读机芯,我使用了著名的Encoder.h库,您可以找到here

这是我的代码

Encoders.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

Encoders.cpp

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



Encoders_::Encoders_(int clk,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_中,我的构造函数为空,这使一切变得容易)

非常感谢您的帮助。

解决方法

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