web-dev-qa-db-fra.com

Erreur Arduino: ne nomme pas un type?

J'ai écrit une bibliothèque, mais avoir un problème avec l'erreur ne nomme pas un type. J'ai tout essayé, cherché pendant quelques heures et pas de chance. La bibliothèque est placée dans le dossier "libraries" du dossier esquisse arduino. S'il vous plaît aider !!! J'utilise OSX, mais le même problème se produit également sous Windows.

C'est le fichier d'en-tête de la bibliothèque:

#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

C'est le fichier .cpp de la bibliothèque:

#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;
}

Et voici le fichier .ino où la bibliothèque est incluse:

#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() {

}

c'est l'erreur:

Dans le fichier inclus à partir de Test_OpticalSensorLib.ino: 1: /Users/gaspersladic/Documents/Arduino/libraries/OpticalSensor/OpticalSensor.h:34: erreur: 'Adafruit_RGBLCDShield' ne nomme pas un type /Users/gaspersladic/Documents/Arduino/libraries/OpticalSensor/OpticalSensor.h:35: erreur: 'Fichier' ne nomme pas un type

4
Gašper Sladič

Les deux inclus que vous mentionnez dans votre commentaire sont essentiels. 'ne nomme pas un type' signifie simplement qu'il n'y a pas de définition de cet identifiant visible pour le compilateur. S'il y a des erreurs dans la bibliothèque LCD que vous mentionnez, il faut alors les résoudre - l'omission de #include ne réglera définitivement pas le problème!

Deux notes d'expérience qui pourraient être utiles:

  1. Vous devez ajouter tous les # inclus dans l'esquisse principale, qu'ils soient inclus ou non via un autre #include.

  2. Si vous ajoutez des fichiers au dossier de la bibliothèque, l’Arduino IDE doit être redémarré avant que ces nouveaux fichiers ne soient visibles.

9
Peter B

J'ai eu l'erreur does not name a type lors de l'installation de la bibliothèque NeoMatrix. 

Solution: les fichiers .cpp et .h doivent figurer dans le dossier principal lors de la copie, par exemple: 

myArduinoFolder/libraries/Adafruit_NeoMatrix/Adafruit_NeoMatrix.cpp

Lorsque j'ai utilisé le programme de décompression Windows par défaut, il a imbriqué le contenu dans un autre dossier:

myArduinoFolder/libraries/Adafruit_NeoMatrix/Adafruit_NeoMatrix/Adafruit_NeoMatrix.cpp

J'ai déplacé les fichiers vers le haut, donc c'était: 

myArduinoFolder/libraries/Adafruit_NeoMatrix/Adafruit_NeoMatrix.cpp

Cela a résolu le problème does not name a type.

2
asdf

La seule chose à faire est d’ajouter cette ligne à votre croquis

#include <SPI.h>

avant #include <Adafruit_MAX31855.h>.

0
kaz_at_capsellab

Je ne le sais pas c'est votre problème mais c'était le mien.

Void setup () ne nomme pas un type 

MAIS

void setup () est ok. 

J'ai trouvé que l'esquisse que j'ai copiée pour un autre projet était pleine de lettres «de casse». Une fois corrigé, il fonctionnait sans à-coups. texte souligné

0
Unkl Chucklz

Plus récemment, j'ai constaté que d'autres facteurs seraient également à l'origine de cette erreur. J'ai eu un AES.h, AES.cpp contenant une classe AES et il a donné cette même erreur inutile. Ce n'est que lorsque j'ai renommé Encryption.h, Encryption.cpp et Encryption en tant que nom de classe que cela a soudainement commencé à fonctionner. Il n'y a pas eu d'autre changement de code.

0
Jason