web-dev-qa-db-ja.com

Arduinoエラー:タイプに名前を付けませんか?

ライブラリを作成しましたが、タイプに名前を付けないとエラーが発生します。私はすべてを試し、数時間検索しましたが、運はありませんでした。ライブラリは、arduinoスケッチフォルダーの「libraries」フォルダーに配置されます。助けてください!!! OSXを使用していますが、Windowsでも同じ問題が発生します。

これはライブラリのヘッダーファイルです。

#ifndef OpticalSensor_h
#define OpticalSensor_h

#include <Arduino.h>
#include <SD.h>
#include <Wire.h>
#include <Adafruit_MCP23017.h>
#include <Adafruit_RGBLCDShield.h>
#include <String.h>

class OpticalSensor
{
    public:
        OpticalSensor(int analogPort);
        void LCDInit(int columns, int rows);
        void SerialInit(int bitRate);
        void SDInit();
        double& ReadFromAnalogPort();
        void SDCreateFile(String fileName);
        void SDDeleteFile(String fileName);
        void SDWriteToFile(String fileName);
        void SDStreamToFile(String Text);
        void SDOpenFileToStream(String fileName);
    private:
        int _analogPort;
        bool _displayFlag;
        Adafruit_RGBLCDShield _lcd;
        File _MainRecFile;
        double _voltage;
        void _LCDClearAll();
        void _LCDWriteInTwoRows(String row1, String row2);
        void _DelayAndClearLCD(bool returnStatus);
};

#endif

これはライブラリの.cppファイルです。

#include <OpticalSensor.h>

Adafruit_RGBLCDShield _lcd;
File _MainRecFile;
double _voltage;

OpticalSensor::OpticalSensor(int analogPort)
{
    _analogPort = analogPort;
}

void OpticalSensor::LCDInit(int columns, int rows)
{

    _lcd = Adafruit_RGBLCDShield();
    _lcd.begin(columns,rows);
}

void OpticalSensor::SerialInit(int bitRate)
{
    Serial.begin(bitRate);
    _bitRate = bitRate;
    while(!Serial) {
        //wait until serial is not open
    }
}

void OpticalSensor::SDInit()
{
    // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
    // Note that even if it's not used as the CS pin, the hardware SS pin
    // (10 on most Arduino boards, 53 on the Mega) must be left as an output
    // or the SD library functions will not work.
    pinMode(10, OUTPUT);

    //check if SD can be found and initialized. Print also message to
    //Serial if initialized and to _lcd if initialized.
   if(!SD.begin(4)) {
     if(Serial){
         Serial.println("Initialization failed!");
     }
     if(_lcd){
         _lcd.print("Init failed!");
     }
     _DelayAndClearLCD(true);
   }
   else {
       if(Serial) {
           Serial.println("Initialization done!");
       }
       if(_lcd) {
           lcd.print("Init done!");
       }
       _DelayAndClearLCD(false);
   }
}

void OpticalSensor::SDCreateFile(String fileName)
{
    //check if file allready exists, if not it creates one
    //and writes apropriate response to
    //lcd and Serial if they are initialized.
    if(SD.exists(fileName)) {
        if(Serial) {
            Serial.println(fileName + " already exists!");
        }
        if(_lcd) {
            _LCDWriteInTwoLines(fileName,"already exists!");
        }
        _DelayAndClearLCD(false);
    }
    else
    {
        if(Serial) {
            Serial.println(fileName + "Creating file " + fileName + "...");
        }
        if(_lcd) {
            _LCDWriteInTwoLines("Creating file", fileName);
        }
        _MainRecFile = SD.open(fileName + ".txt", FILE_WRITE);
        _MainRecFile.close();
        _DelayAndClearLCD(false);


        //check if file was created successffully and print apropriate response
        //to lcd and Serial if they are initialized
        if(SD.exists(fileName + ".txt")) {
            if(Serial) {
                Serial.println(fileName + ".txt" + " created successffully!");
            }
            if(_lcd) {
                _LCDWriteInTwoLines(fileName + ".txt", "created!");
            }
            _DelayAndClearLCD(false);
        }
        else {
            if(Serial) {
                Serial.println("error: failed to create file!");
            }
            if(_lcd) {
                _LCDWriteInTwoLines("error: failed to","create file!");
            }
            _DelayAndClearLCD(false);
        }
    }
}

//delete file from SD card
void OpticalSensor::SDDeleteFile(String fileName)
{

}

//open file, write data to it, and close file after.
void OpticalSensor::SDWriteToFile(String fileName, String Text)
{
    _MainRecFile = SD.open(fileName + ".txt", FILE_WRITE);
    _MainRecFile.println(Text);
    _MainRecFile.close();
}

//Open file to stream data to it.
void OpticalSensor::SDOpenFileToStream(String fileName)
{
    _MainRecFile = SD.open(fileName + ".txt", FILE_WRITE);
}

//Write data to file while file is open.
//Notice that you can stream data only to one file at a time!!!
//For instance, if you have two sensors that you want to
//write data to two different files, you have to use SDWriteToFile
//function!!!
void OpticalSensor::SDStreamToFile(String Text)
{
    if(_MainRecFile) {
        _MainRecFile.println(Text);
    }
}

//close file that you streamed data too.
void OpticalSensor::SDCloseStreaming(String fileName)
{
    _MainRecFile.close();
}

//clear entire LCD
void OpticalSensor::_LCDClearAll()
{
    _lcd.clear();
    _lcd.setCursor(0,0);
}

void OpticalSensor::_LCDWriteInTwoRows(String row1, String row2)
{
    //write first String in row1
    _lcd.print(row1);
    //set cursor to the beginning of row 2
    _lcd.setCursor(0,1);
    //write second String to row 2
    _lcd.print(row2);
}

void OpticalSensor::_DelayAndClearLCD(bool returnStatus)
{
    //if Serial or _lcd are initialized, delay for 2 seconds
    //and clear LCD
    if(Serial || _lcd) {
        delay(2000);
        if(_lcd)
            _LCDClearAll();
    }
    //terminate
    if(bool == true) {
        return;
    }
}

double& ReadFromAnalogPort()
{
    _voltage = analogRead(_analogPort);
    return _voltage;
}

そして、これはライブラリが含まれている.inoファイルです:

#include <OpticalSensor.h>

OpticalSensor sensor(0);

void setup() {
  sensor.LCDInit(16,2);
  sensor.SerialInit(9600);
  sensor.SDInit();
  sensor.SDCreateFile("test1");
  sensor.SDOpenFileToStream("test1");
}

void loop() {

}

これはエラーです:

Test_OpticalSensorLib.ino:1からインクルードされたファイル内:/Users/gaspersladic/Documents/Arduino/libraries/OpticalSensor/OpticalSensor.h:34:エラー: 'Adafruit_RGBLCDShield'はタイプ/ Users/gaspersladic/Documents/Arduino/libraries /を指定していませんOpticalSensor/OpticalSensor.h:35:エラー: 'ファイル'はタイプに名前を付けていません

4
Gašper Sladič

コメントで言及する2つのインクルードは必須です。 「型に名前を付けない」とは、コンパイラに認識されるその識別子の定義がないことを意味します。 LCDライブラリにエラーがある場合は、それらに対処する必要があります-#includeを省略しても間違いは修正されません!

役立つかもしれない経験からの2つのメモ:

  1. すべての#includeをメインスケッチに追加する必要があります-別の#includeを介してインクルードされているかどうかは関係ありません。

  2. ライブラリフォルダーにファイルを追加する場合、新しいファイルを表示するには、Arduino IDEを再起動する必要があります。

9
Peter B

NeoMatrixライブラリをインストールするときにdoes not name a typeエラーが発生しました。

解決策:.cppおよび.hファイルは、コピーするときに最上位フォルダーにある必要があります。例:

myArduinoFolder/libraries/Adafruit_NeoMatrix/Adafruit_NeoMatrix.cpp

デフォルトのWindows解凍プログラムを使用すると、別のフォルダー内にコンテンツがネストされました。

myArduinoFolder/libraries/Adafruit_NeoMatrix/Adafruit_NeoMatrix/Adafruit_NeoMatrix.cpp

ファイルを上に移動したので、次のようになりました。

myArduinoFolder/libraries/Adafruit_NeoMatrix/Adafruit_NeoMatrix.cpp

これにより、does not name a typeの問題が修正されました。

2
asdf

あなたがしなければならない唯一のことはあなたのスケッチにこの線を追加することです

#include <SPI.h>

#include <Adafruit_MAX31855.h>

0

私のコードはArduinoのvoid setup()またはvoid loop()の範囲外でした。

0
Vitalicus

この問題の解決策は "}"で見つかりました。スケッチにいくつかの変更を加え、 "}"を確認するのを忘れて、余分なものがありました。私がそれを削除してコンパイルするとすぐに、すべてがうまくいきました。

0
RobertoFRey

これがあなたの問題だとは知らないが、それは私のものだった。

Void setup()はタイプに名前を付けません

だが

void setup()は問題ありません。

別のプロジェクトのためにコピーしたスケッチは、「間違ったケース」の文字でいっぱいだったことがわかりました。オンフィックス、それはスムーズに実行されました。強調されたテキスト

0
Unkl Chucklz

最近、他の要因もこのエラーの原因になることがわかりました。私はAESクラスを含むAES.h、AES.cppを持っていましたが、この同じ役に立たないエラーが発生しました。クラス名としてEncryption.h、Encryption.cpp、Encryptionに名前を変更した場合にのみ、突然機能し始めました。他のコードの変更はありませんでした。

0
Jason K.