• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Общие вопросы по Arduino IDE для ESP8266

Сергей_Ф

Moderator
Команда форума
@Aviator лежат там где им положено. Вы же не хотите, что бы ИДЕ перестала работать с Arduino.
путь такой ~\AppData\Local\Arduino15
Вас что в Гугле забанили? К чему такие вопросы?
 

combasoft

New member
Всем привет. У меня новичковый вопрос по работе в Aruino IDE.
Я начал было писать скетч с использованием pubSubClient, но количество переменных и констант стало настолько большим, что стало сложно ориентироваться в коде, поэтому я решил выделить в коде отдельные блоки и разнести их по классам.
Почитал как делать либы на ардуине.ру (Hacking/LibraryTutorial)
В итоге у меня получилась структура папок вида
"path to my project\classes\some_packet_name\my_class_name". В папке my_class_name три файлика: один - это keywords.txt, два других это MyClassName.cpp и MyClassName.h
Каждый класс как либу подключать не охота, хочется что б главном файлике проекта MyProject.ino было что-то типа такого:
Код:
#include <\classes\some_packet_name\my_class_name\MyClassName.h>
только такой вариант не получается(
Подскажите плиз как правильно подключить свой класс.
 

combasoft

New member
Не компилится( Ругается:
Arduino: 1.6.12 (Windows XP), Board: "NodeMCU 1.0 (ESP-12E Module), 80 MHz, 115200, 4M (3M SPIFFS)"

In file included from E:\Electronic\полив\testmyLibraries\testmyLibraries.ino:1:0:

sketch\classes\rules\light_rule\LightRule.h:11:15: error: expected unqualified-id before ')' token

LightRule();

^

sketch\classes\rules\light_rule\LightRule.h:9:1: error: an anonymous struct cannot have function members

{

^

sketch\classes\rules\light_rule\LightRule.h:27:1: error: abstract declarator '<anonymous class>' used as declaration

};

^

testmyLibraries:3: error: 'lightRule' does not name a type

exit status 1
'lightRule' does not name a type

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
Что-то вроде проблем с конструктором, который не принимает параметров. Подскажите плиз, что в коде поправить, что б убрать ошибки компиляции?
 

Вложения

combasoft

New member
@combasoft мне кажется он просит убрать точку с запятой в описании класса.
Спасибо, взлетело.
Выходит, на ардуине.ру был бажный пример. Код успешно компилируется как с описанием сигнатуры конструктора в h-файле: ClassName; так и без него, т.е. c закомментаренной этой строкой.
Следующая ошибка
sketch\classes\rules\light_rule\LightRule.h:13:10: error: 'byte<anonymous class>::getResult(int)', declared using anonymous type, is used but never defined [-fpermissive]

byte getResult(int x);
возникает при попытке обращения к одной из функций:
Код:
#include "classes\rules\light_rule\LightRule.h"

LightRule lightRule;

void setup() {
  // put your setup code here, to run once:
  int y = 5;
  byte x = lightRule.getResult(y);
}

void loop() {
  // put your main code here, to run repeatedly:
}
изначально сигнатура у getResult была такая: byte getResult();
а входной параметр я в нее добавил в ходе попыток забороть ошибку, возникающую при компиляции. В общем, с любым вариантом сигнатуры я получаю эту ошибку.
 

combasoft

New member
Проблема была в том, что я неверно использовал директиву define.
В дефайне нужно указывать что-то "говорящее", по чему можно соотнести это имя с конкретным h-файлом. При этом это имя не должно совпадать с именем класса. А именно так у меня и было, вот и не компилировалось. Правда по тексту ошибок от компилятора я бы до каузы еще долго добирался. Помогло сличение того, что я понаделал с примером либы с классом Morse. Переделал дефайн на такой вариант:
#ifndef LightRule_H
#define LightRule_H
и код стал компилироваться.
 

Юрий Ботов

Moderator
Команда форума
LightRule(void);
void doRule(void);
byte getResult(void);

и так до упора
Это gcc и когда вы выползаете за пределы упрощенного языка ардуины и лезете в классы вам придется аккуратно описывать все интерфейсы
 

combasoft

New member
LightRule(void);
void doRule(void);
byte getResult(void);
Я это уже смотрел на stackOverflow) Там говорилось, что в простом С для функции, которая не принимает параметров, нужно указывать void. Для С++ этого делать не требуется. Это же видно на примере с официального сайта дуины - их Morse содержит функции без параметров и они в хедере описаны как someType functionName(); , то есть без void в скобках.
 

Юрий Ботов

Moderator
Команда форума
Там говорилось, что в простом С для функции, которая не принимает параметров, нужно указывать void. Для С++ этого делать не требуется.
не наоборот? :) Тогда прочтите стандарт, а не stackoverflow. Для С отсутствие параметра (или левой части) равнозначно тому что там стоит "int". А вот C++ вообще ни понимает что такое пустые скобки и требует описания... Блин. Какой-же я наверное старый....
 

combasoft

New member
Чет не видать в свободном доступе стандарты( Есть драфт для С99: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf
И да, там было про то, что нужно хоть что-то, но указывать:
At least one type specifier shall be given in the declaration specifiers in each declaration, and in the specifier-qualifier list in each struct declaration and type name.
В Arduino IDE норм компилируется и без void в скобках, как я писал выше. Видимо, компилятор позволяет такие штуки.
 

combasoft

New member
Так заработало или нет? Или так... беседуем
Беседуем) Начиная отсюда Общие вопросы по Arduino IDE для ESP8266 оно собралось и работает. Я расчитывал, что по тексту сообщения это будет понятно. Я же написал, что нашел каузу и какой способ ее исправить.
 

rv9Yw

New member
День добрый.
Есть вопрос следующего характера.
Пишу в Sublime Text c использованием Stino -> тут подробнее хттп://robotosha.ru/arduino/sublime-text-as-ide-arduino.html

Добавил в Arduino IDE через Boards Manager -> ESP8266. В ардуинке все как положено появилось и работает, а вот в STINO нет.


Может кто использует тоже и все работает? Ну или совет куда копать?
Заранее спасибо.
 
Сверху Снизу