-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathESP-Matrix.ino
130 lines (106 loc) · 4.99 KB
/
ESP-Matrix.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/****************************************************************************************************
* LED-Matrix 1.1
* Wolfgang Kraft, Fablab Karlsruhe 2017 *
* Modul um eine Reihe LED-Matrizen (8x8) mittels ESP8266 als Display zu verwenden *
* Erste Features: *
* - ständige Erreichbarkeit des Webservers zur Steuerung der Applikation *
* und Konfiguration des WiFi-Teils (AP oder STA Modus) *
* - Anzeige der aktuellen IP-Adresse nach Start *
* - integrierter HTML Editor für SPIFFS-Dateien auch ohne Internet-Verbindung *
* ToDos: *
* - Refactoring, Zusammenfassen der Webserverfunktionen in eine eigene Bibliothek als *
* Webapplication-Basisklasse *
* * mehrstufige Benutzerauthentifizierung und -verwaltung (z.B. Konfiguration und Anwendung *
* der Applikation *
* * Ausbau der IP-Konfiguration um WPS, feste IP-Adressen, DHCP-Ranges, Nameserver, *
* Mailgateway ... *
* * Einsatz von https *
* - Durchreichen verschiedener ESP-Funktionen an Javascript (vgl. Firmata) *
* *
*****************************************************************************************************/
#include "AllIncludes.h"
// globale Variablen ==============================================================================//
// Konfiguration für Flash
struct T_ConfigStruct {
char magic[5] = CONF_MAGIC;
uint8_t version = CONF_VERSION;
char mySSID[32] = CONF_DEFAULT_SSID;
char myPWD[64] = CONF_DEFAULT_PWD;
char myHostname[20] = CONF_HOSTNAME;
char myAdminUser[20] = CONF_ADMIN_USER;
char myAdminPWD[20] = CONF_ADMIN_PWD;
uint8_t myChannel = CONF_DEFAULT_CHANNEL;
} GlobalConfig;
void ConfigSave( struct T_ConfigStruct* conf) {
EEPROM.begin(512);
uint8_t* confAsArray = (uint8_t *) conf;
for (uint16_t i=0; i<sizeof(T_ConfigStruct); i++) {
EEPROM.write(i,confAsArray[i]);
}
EEPROM.commit();
EEPROM.end();
}
void ConfigLoad( struct T_ConfigStruct* conf) {
EEPROM.begin(512);
uint8_t* confAsArray = (uint8_t*) conf;
for (uint16_t i=0; i<sizeof(T_ConfigStruct); i++) {
confAsArray[i]=EEPROM.read(i);
}
EEPROM.commit();
EEPROM.end();
}
void LoadAndCheckConfiguration( void) {
struct T_ConfigStruct newConf;
ConfigLoad(&newConf);
if (strncmp(newConf.magic, GlobalConfig.magic, sizeof(newConf.magic)) == 0){
Serial.println("Magic string from configuration is ok, overload configuration from eeprom");
ConfigLoad(&GlobalConfig);
} else {
Serial.println("Magic string mismatch, keeping with default configuration");
}
}
char myIPaddress[18]="000.000.000.000 ";
// Zeitserver und Zeithandling
IPAddress timeServer(0, 0, 0, 0); // wird per NTP ermittelt
AsyncUDP ntpClient; // asynchroner UDP Socket für NTP-Abfragen
uint8_t NTPpacket[ 48]; // Anfragepaket für NTP-Anfragen
TimeChangeRule CEST = {"CEST", Last, Sun, Mar, 2, 120}; //Central European Summer Time
TimeChangeRule CET = {"CET ", Last, Sun, Oct, 3, 60}; //Central European Standard Time
TimeChangeRule *tcr; // Zeiger auf aktuelle Zeitzone
Timezone CE(CEST, CET);
time_t localTime;
LEDmatrix myMatrix(4,1);
void setup(){
Serial.begin(115200);
Serial.setDebugOutput(true);
LoadAndCheckConfiguration();
WiFi.hostname(GlobalConfig.myHostname);
ETS_UART_INTR_DISABLE();
wifi_station_disconnect();
ETS_UART_INTR_ENABLE();
SPIFFS.begin();
WiFi.setOutputPower(20.5); // möglicher Range: 0.0f ... 20.5f
WiFi.mode(WIFI_STA);
Serial.println("Start in Client Mode!");
WiFi.begin();
if (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println("Start in Access Point Mode!");
WiFi.mode(WIFI_AP);
WiFi.softAP(GlobalConfig.mySSID, GlobalConfig.myPWD, GlobalConfig.myChannel);
strlcpy(myIPaddress, WiFi.softAPIP().toString().c_str(), sizeof(myIPaddress));
Serial.println(GlobalConfig.mySSID);
} else {
WiFi.setAutoReconnect(true);
strlcpy(myIPaddress, WiFi.localIP().toString().c_str(), sizeof(myIPaddress));
}
int16_t numWLANs= WiFi.scanComplete();
if (numWLANs == -2) { // es gab bislang noch keinen WLAN-Scan
WiFi.scanNetworks(true);
}
setupTime();
setupWebserver();
}
void loop() {
myMatrix.loop();
do_pending_Webserver_Actions();
}