2016-03-14 3 views
0

По мере увеличения моих эскизов код выглядит ужасно, поскольку один файл и число глобальных переменных слишком велико.Эскиз с несколькими файлами arduino esp8266, ссылающийся на сервер

Для части веб-дизайна моего эскиза устройство пытается выйти в интернет, и если он не работает, он сканирует доступные беспроводные сети, переходит в режим точки доступа, запускает сервер, отправляет список ssid и прослушивает ответ ssid/passwd. Сервер предназначен только для конфигурации.

В идеале я хотел бы очищенный файл main.ino выглядеть

#include "config.h" 
void setup(){ 
    Serial.begin(115200); 
    Serial.println(); 
    Serial.println("--------------------------"); 
    Serial.println("ESP8266 multifile"); 
    Serial.println("--------------------------"); 
    getOnline(); 
} 
void loop(){ 
    if(IN_CONFIG_MODE){ 
     server.handleClient(); 
    } 
} 

с config.h что-то вроде ..

#ifndef config_h 
    #define config_h 
     #include <ESP8266WiFi.h> 
     #include <ESP8266WebServer.h> 
     ESP8266WebServer server; 
     void getOnline(); 
    #endif 

и затем config.cpp где его делает все, что описано выше, но дает доступ к программе main.ino к экземпляру server, чтобы он мог слушать в основном цикле.

#include "config.h" 
#include <Arduino.h> 
#include <ESP8266WiFi.h> 
#include <ESP8266WebServer.h> 

char *espssid = "espAPsb"; 
char *ssid = "street_no_vale2"; 
char *pwd = "jjjjjjjjx"; 
char ssids[300]; 

extern server(80); 

void handleRoot(){ 
    server.send(200, "text/html", "<h1>root of espAPsb AP server</h1>"); 
    //send json of available ssids 
} 

void scan(){ 
    WiFi.mode(WIFI_STA); 
    WiFi.disconnect(); 
    delay(100); 
    int n = WiFi.scanNetworks(); 
    Serial.println("scan done"); 
    if (n == 0) 
    Serial.println("no networks found"); 
    else 
    { 
    Serial.print(n); 
    Serial.println(" networks found"); 
    for (int i = 0; i < n; ++i) 
    { 
     // Print SSID and RSSI for each network found 
     Serial.print(i + 1); 
     Serial.print(": "); 
     Serial.print(WiFi.SSID(i)); 
     Serial.print(" ("); 
     Serial.print(WiFi.RSSI(i)); 
     Serial.print(")"); 
     Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE)?" ":"*"); 
     delay(10); 
    } 
    } 
    Serial.println(""); 
} 

void setupAP(){ 
    WiFi.softAP(espssid); 
    server.on("/", handleRoot); 
    server.begin(); 
    Serial.println(); 
    Serial.print("connected as AP "); 
    Serial.println(espssid); 
    Serial.print("IP address: "); 
    Serial.println(WiFi.softAPIP()); 
} 

void getOnline(){ 
    WiFi.begin(ssid, pwd); 
    int tries =0; 
    int success=1; 
    while (WiFi.status() != WL_CONNECTED) { 
    delay(500); 
    Serial.print("."); 
    tries++; 
    if (tries==15){ 
     success=0; 
     Serial.println("WiFi not connected"); 
     scan(); 
     setupAP(); 
     break; 
    } 
    } 
    if (success){ 
    Serial.println(""); 
    Serial.println("WiFi connected"); 
    Serial.print("IP address: "); 
    Serial.println(WiFi.localIP());  
    } 
} 
+0

Это не код C. Arduino не является C или (стандартным) C++. – Olaf

+0

Правда, но моя проблема связана с «c-like» частями, заголовочными файлами, декларациями внешних переменных и классов, которые я вижу во многих библиотеках, поддерживающих эти микроконтроллеры. Это больше похоже на C, чем на javascript :) – mcktimo

+0

Существует больше языков программирования, чем C и JavaScript. C не имеет классов. Пожалуйста, сделайте некоторое исследование. Обработка основана на C++ (но не совсем как C++). – Olaf

ответ

1

Вы можете создать собственную библиотеку из своего сетевого кода, которую вы можете легко использовать повторно. https://www.arduino.cc/en/Hacking/LibraryTutorial

В качестве альтернативы вы можете использовать несколько «вкладок» в Arduino IDE, которые работают как стандартный проект с несколькими источниками. http://arduino.land/FAQ/content/7/43/en/breaking-a-sketch-into-multiple-files.html

(Btw, StackExchange проводит специальный микросайт Ardunio здесь: https://arduino.stackexchange.com/ Have там весело :)

+0

скопирован на arduino.stackechange по совету @Gee_Bee. Я могу получить https://www.arduino.cc/en/Hacking/LibraryTutorial для работы, а также http://arduino.land/FAQ/content/7/43 /en/breaking-a-sketch-into-multiple-files.html и http://arduinoetcetera.blogspot.com/2011/01/classes-within-classes-initialiser.html Я могу даже получить ссылки extern на переменные для работы но ссылка на экземпляр ESP8266WebServer в разных файлах по-прежнему вне меня – mcktimo

+0

О, так что ваш вопрос: «как ссылаться на переменную, объявленную в другом исходном файле», а не «как лучше структурировать мой код в нескольких исходных файлах/библиотеках ». Заметано. Вы объявляете переменную (то есть экземпляр ESP8266WebServer) в одном файле, и вы можете ссылаться на это ключевое слово extern в другом файле, см. Http://forum.arduino.cc/index.php?topic=43507.0 –

+0

* Однако * если вы хотите, чтобы это было хорошо, я сделал бы собственный класс cpp со специальным кодом ESP8266 и использовал бы это из моего эскиза Arduino. Например, ваш новый класс cpp может иметь один метод connect() (aka getOnline), который вы можете красиво вызывать из вашего основного эскиза. Это гораздо лучший подход, чем позволить экземпляру ESP8266WebServer указываться во всех других кодах суса - это действительно нарушит концепцию модульного программирования. –