[解決済み】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: error: 'Adafruit_RGBLCDShield' does not name a type /Users/gaspersladic/Documents/Arduino/libraries/OpticalSensor/OpticalSensor.h:35: error: 'File' does not name a type
解決方法は?
コメントにある2つのincludeは必須です。 型名がない」というのは、コンパイラから見える識別子の定義がないことを意味します。 もしLCDライブラリにエラーがあるのなら、それを解決する必要があります。
経験上、参考になりそうなメモを2つ。
-
他の#includeを介してインクルードされているかどうかに関係なく、すべての#includeをメインスケッチに追加する必要があります。
-
ライブラリフォルダにファイルを追加した場合、それらの新しいファイルが表示される前にArduino IDEを再起動する必要があります。
関連
-
[解決済み】Arduino Leonardo - "avrdude: butterfly_recv(): programmer is not responding".
-
[解決済み】Arduinoのエラー:型に名前がない?
-
[解決済み] arduinoが最後のアップロードで突然 "avrdude: ser_open(): can't open device "\.\COM3""" と表示される。
-
[解決済み] Esp32cam ESP32への接続に失敗:パケットヘッダ待ちでタイムアウト
-
[解決済み] ArduinoでLEDストリップに虹色の波を作るには?
-
[解決済み] ESP32-camの「Brownout detector was triggered」エラーについて、何か解決策はありますか?
-
Luat Module Air724開発ボード スタートガイド (1)
-
arduino upload error, avrdude: ser_open(): can't open device &quot;\. \COM3&quot;: 指定されたファイルが見つかりません。という問題が発生しました。
-
Arduino 003 Ubuntu (Linux)でボードを焼く方法
-
Arduino ide 1.6.9のエラーに関する問題: 'TKD2' はこのスコープで宣言されていません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Arduino Leonardo - "avrdude: butterfly_recv(): programmer is not responding".
-
[解決済み】Arduinoのエラー:型に名前がない?
-
[解決済み] ESP32-WROOM-32とESP32-WROVERを比較。
-
[解決済み] ESP32-camの「Brownout detector was triggered」エラーについて、何か解決策はありますか?
-
[解決済み] Javaベースのマイクロコントローラ?[クローズド]
-
Luat Module Air724開発ボード スタートガイド (1)
-
arduino upload error, avrdude: ser_open(): can't open device &quot;\. \COM3&quot;: 指定されたファイルが見つかりません。という問題が発生しました。
-
Arduino ide 1.6.9のエラーに関する問題: 'TKD2' はこのスコープで宣言されていません。
-
arduino+i2c 1602 画面表示 シリアル入力データ 注意事項
-
[解決済み] Arduinoでintをstringに変換する方法は?