johnwasser:
You could use arrays:
const char *NodeCxNames[] = {"NODEC1", "NODEC2", "NODEC3", "NODEC4", "NODEC5",
"NODEC6", "NODEC7", "NODEC8", "NODEC9", "NODECA"
};
const char *CxNodeNames[] = {"C1NODE", "C2NODE", "C3NODE", "C4NODE", "C5NODE",
"C6NODE", "C7NODE", "C8NODE", "C9NODE", "CANODE"
};
{
if (menuPosition >= 1 && menuPosition <= 10)
{
byte index = menuPosition - 1;
_pwmLVal[index] = _pwmLVal[index] + 50;
if (_pwmLVal[index] > 1001)
{
_pwmLVal[index] = 1;
}
j = index;
Serial.print("pwmvalue");
Serial.println(_pwmLVal[index]);
sendCommand(Client1, _pwmLVal[index], NodeCxNames[index], CxNodeNames[index]);
_menuSelect(0, 0, 2, array[index], (index==9) ? "Light:All" : "Light:");
}
}
Thanks i did not think of that initially. That did work.
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <Adafruit_SSD1306.h>
IPAddress local_IP(192, 168, 4, 1);
IPAddress gateway(192, 168, 4, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress Client1(192, 168, 4, 101);
int i = 0;
const char* ssid = "LCS";
const char* password = "a1b2c3d4";
WiFiUDP Udp;
unsigned int localUdpPort = 4210; // local port to listen on
unsigned int clientPort = 4220;
char incomingPacket[255]; // buffer for incoming packets
const char *NodeCxNames[] = {"NODEC1", "NODEC2", "NODEC3", "NODEC4", "NODEC5",
"NODEC6", "NODEC7", "NODEC8", "NODEC9", "NODECA",
"C1NODE", "C2NODE", "C3NODE", "C4NODE", "C5NODE",
"C6NODE", "C7NODE", "C8NODE", "C9NODE", "CANODE"
};
int _pwmLVal[] = {1, 1, 1, 1, 1, 1, 1, 1, 1};
int array[9];
const int _menuButton = 12;
int _menuButtonState = 0;
const int _upButton = 14;
int _upButtonState = 0;
const int _downButton = 13;
int _downButtonState = 0;
int lastUpButtonState = LOW;
unsigned long lastDebounceTime = 0; // the last time the output pin was toggled
unsigned long debounceDelay = 50;
int menuPosition = 0;
bool sent = false;
bool connected = false;
int j = 0;
unsigned long now = 0;
unsigned long now2 = 0;
unsigned long now3 = 0;
unsigned long now4 = 0;
#define OLED_RESET LED_BUILTIN //
Adafruit_SSD1306 display(OLED_RESET);
void sendCommand(IPAddress to, int data, int id ) {
Serial.println(id);
Udp.beginPacket(to, clientPort);
Udp.write(NodeCxNames[id - 1]);
Udp.write((uint8_t*)&data, 4); //cast to bytes
Udp.write(NodeCxNames[id + 9]);
Udp.endPacket();
}
void setup() {
Serial.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
pinMode(_menuButton, INPUT);
pinMode(_upButton, INPUT);
pinMode(_downButton, INPUT);
WiFi.setOutputPower(20.5);
WiFi.persistent(0);
Serial.begin(115200);
Serial.println();
WiFi.mode(WIFI_AP);
while (!WiFi.softAP(ssid, password, 9, false, 15)) {
delay(500);
Serial.print(".");
}
Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!");
Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.softAPIP().toString().c_str(), localUdpPort);
display.printf("Now listening at IP %s, UDP port %d\n", WiFi.softAPIP().toString().c_str(), localUdpPort);
display.display();
Udp.begin(localUdpPort);
}
void defualtLayout() {
display.setTextSize(1);
display.setCursor(0, 0);
display.clearDisplay();
for (int i = 0; i <= 8; i++) {
display.print("L");
display.print(i + 1);
display.print(":");
display.println(array[i]);
if (i == 7) {
display.setCursor(50, 0);
}
}
if (connected) {
display.setCursor(50, 50);
display.println("Connected!");
}
display.display();
}
void _menuSelect(int x, int y, int _size, int Val, char item[]) {
display.clearDisplay();
display.setTextSize(_size);
display.setCursor(x, y);
if (i == 10) {
display.println("Light:All");
} else {
display.print(item);
display.println(i);
}
if (Val != 1002) {
display.println(Val);
}
display.display();
}
void loop() {
_menuButtonState = digitalRead(_menuButton);
int _upButtonReading = digitalRead(_upButton);
_downButtonState = digitalRead(_downButton);
if (_upButtonReading != lastUpButtonState) {
// reset the debouncing timer
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (_upButtonReading != _upButtonState) {
_upButtonState = _upButtonReading;
if (_upButtonState == HIGH) {
if (menuPosition > 0) {
int r = menuPosition;
_pwmLVal[r - 1] = _pwmLVal[r - 1] + 50;
if (_pwmLVal[r - 1] > 1001) {
_pwmLVal[r - 1] = 1;
}
j = r - 1;
Serial.println(_pwmLVal[r - 1]);
sendCommand(Client1, _pwmLVal[r - 1], r);
}
}
}
}
lastUpButtonState = _upButtonReading;
if (_menuButtonState == HIGH) {
menuPosition ++;
if (menuPosition > 0 && menuPosition < 11) {
i = menuPosition;
_menuSelect(0, 0, 2, 1002, "Light:");
} else {
i = 0;
menuPosition = 0;
defualtLayout();
}
}
int packetSize = Udp.parsePacket();
if (packetSize) {
char verifyStart[7];//NODEC1 plus null
char verifyEnd[7];//C1NODE plus null
int _data;
int len = Udp.read(incomingPacket, 800);
strncpy (verifyStart, (char*)incomingPacket, 6);//6 bytes
strncpy (verifyEnd, (char *)incomingPacket + len - 6 , 6 );//6 bytes
verifyStart[6] = 0; //null terminate
verifyEnd[6] = 0; //null terminate
if (strcmp(verifyStart, "NODEUD") == 0) {
if (strcmp(verifyEnd, "UDNODE") == 0) {
memcpy(&array, incomingPacket + 6 , sizeof(array)); //copy 4 bytes to _data
array[10] = 0; //null terminate
now4 = millis();
connected = true;
if (menuPosition == 0) {
defualtLayout();
}
}
}
}
if (millis() - now4 >= 3000) {
connected = false;
if (menuPosition == 0) {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 20);
display.println("DISCONNECTED!!");
display.display();
now4 = millis();
}
}
if (millis() - now2 >= 1000) {
if (menuPosition != 0 && menuPosition != 10) {
_menuSelect(0, 0, 2, array[i - 1], "Light:");
}
if (i == 10) {
_menuSelect(0, 0, 2, array[0], "Light:");
}
now2 = millis();
}
if (millis() - now >= 2000) {
if (_upButtonState == LOW) {
if (_downButtonState == LOW) {
if (menuPosition == 0) {
if (connected) {
defualtLayout();
}
}
}
}
now = millis();
}
}
i ended up being able to shorten the code over 200 lines. i actually had to use debounce because the code runs so much faster now
edit: i just removed the debounce without delay and just add a delay because i dont need non blocking