]> git.gir.st - Ledberg-ESP8266.git/blob - Udp/Udp.ino
implement storing color and use wifimanager to keep track of ssid/psk
[Ledberg-ESP8266.git] / Udp / Udp.ino
1 /*
2 firmware for ESP-Ledberg mod. Based on UDPSendReceive.pde
3 set STASSID and STAPSK; will listen on port 1337.
4 (c) 2019 Tobias Girstmair, GPLv3
5 https://gir.st/blog/esp8266-ledberg.htm
6 */
7
8
9 #include <ESP8266WiFi.h>
10 #include <WiFiUdp.h>
11 #include <ESP_EEPROM.h> // flash protective version of <EEPROM.h>
12 #include <WiFiManager.h>
13 typedef unsigned char uint8;
14
15 unsigned int localPort = 1337; // local port to listen on
16 uint8 rgb[3] = {0xff, 0x6b, 0x55}; // gives nice, slightly warm, white on boot
17 //very warm: {0x93, 0x35, 0x20}
18 int active = 1;
19 const int red = 14;
20 const int grn = 12;
21 const int blu = 13;
22
23 const uint rgb_addr = 0;
24 WiFiUDP Udp;
25
26 #define ACK 0x06
27 #define NAK 0x15
28
29 void setup() {
30 pinMode(red, OUTPUT);
31 pinMode(grn, OUTPUT);
32 pinMode(blu, OUTPUT);
33 Serial.begin(115200);
34 EEPROM.begin(sizeof rgb);
35
36 uint8 tmp[3];
37 EEPROM.get(rgb_addr,tmp);
38 if (!tmp[0] && !tmp[1] && !tmp[1]) {//XXX: untested
39 EEPROM.put(rgb_addr, rgb);
40 EEPROM.commit();
41 }
42 EEPROM.get(rgb_addr,rgb);
43 analogWrite(red, rgb[0]<<2);
44 analogWrite(grn, rgb[1]<<2);
45 analogWrite(blu, rgb[2]<<2);
46
47 WiFiManager wifiManager;
48 wifiManager.setHostname("girst-LEDBerg"); // needs at least wifimanager 2.0.12-beta (tested with 2.0.14-beta)
49 wifiManager.autoConnect("gir.st LEDBerg");
50
51 Serial.print("Connected! IP address: ");
52 Serial.println(WiFi.localIP());
53 Serial.printf("UDP server on port %d\n", localPort);
54 Udp.begin(localPort);
55 }
56
57 void loop() {
58 // if there's data available, read a packet
59 int packetSize = Udp.parsePacket();
60 if (packetSize) {
61 uint8 response = NAK;
62 Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
63
64 // read the packet into packetBufffer
65 uint8 type;
66 Udp.read(&type, 1);
67 switch (type) {
68 case 0: // get current power,r,g,b
69 Udp.write(ACK);
70 Udp.write(active);
71 Udp.write(rgb[0]);
72 Udp.write(rgb[1]);
73 Udp.write(rgb[2]);
74 break;
75 case 1: // set on/off
76 if (packetSize == 2) { //type+power
77 active = Udp.read();
78 Udp.write(ACK);
79 } else {
80 Udp.write(NAK);
81 }
82 break;
83 case 2: // set rgb
84 if (packetSize == 4) { //type+r+g+b
85 uint8 tmp[3];
86 Udp.read(tmp, 3);
87 if (tmp[0]+tmp[1]+tmp[2] > 512) {
88 Udp.write(NAK);
89 break;
90 }
91 for (int i = 0; i < 3; i++) {
92 rgb[i] = tmp[i];
93 }
94 Udp.write(ACK);
95 } else {
96 Udp.write(NAK);
97 }
98 break;
99 case 3: // save color to eeprom
100 EEPROM.put(rgb_addr, rgb);
101 EEPROM.commit();
102 Udp.write(ACK);
103 break;
104 default: //send nak
105 Udp.write(NAK);
106 }
107 Udp.endPacket();
108 if (active) {
109 analogWrite(red, rgb[0]<<2);
110 analogWrite(grn, rgb[1]<<2);
111 analogWrite(blu, rgb[2]<<2);
112 } else {
113 analogWrite(red, 0);
114 analogWrite(grn, 0);
115 analogWrite(blu, 0);
116 }
117 }
118 delay(10);
119 }
Imprint / Impressum