multiplexer.ino 8.0 KB
/*
   There are three serial ports on the ESP known as U0UXD, U1UXD and U2UXD.

   U0UXD is used to communicate with the ESP32 for programming and during reset/boot.
   U1UXD is unused and can be used for your projects. Some boards use this port for SPI Flash access though
   U2UXD is unused and can be used for your projects.

*/

#define RXD2 16
#define TXD2 17
#define ADDR 0
#include <ArduinoJson.h>
#include <HardwareSerial.h>
long _TIME_OUT = 45L;
long TIME_OUT = _TIME_OUT;
String in;
void setup()
{
    Serial.begin(115200);    
    pinMode(13, OUTPUT);
    Serial.println("wait 30s to open pin 13");
    delay(1000*5);     
    digitalWrite(13, 1);
    
    // Serial1.begin(9600, SERIAL_8N1, RXD2, TXD2);
    Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2); // Note the format for setting a serial port is as follows: Serial2.begin(baud-rate, protocol, RX pin, TX pin);
    // Serial.println("Serial Txd is on pin: "+String(TX));
    // Serial.println("Serial Rxd is on pin: "+String(RX));

    while (!Serial)
        ;

    Serial.println();

    Serial.println("Input an str (waiting for 0.5 seconds");
    delay(2000); 
    //delay(1000);
    //digitalWrite(13, 0);
    //delay(1000); 
    //digitalWrite(13, 1);
}

void loop()
{
    serial();
    // delay(100);
    // Serial.println("flag1");
    // Serial2.println("abcdefg");
    // sensortomain();
}
void serial()
{
    String bufferx = "";

    int value;

    if (Serial.available() > 0)
    {
        unsigned long timeLastInput = millis();
        // char buffer[10];

        while (true)
        {
            char x = Serial.read();
            if (x > 22 && x < 126)
            {
                bufferx += x;
            }
            else if (x == '\n')
            {
                // buffer[index] = 0;
                // value = atoi(buffer);
                // Serial.print("Recived:");

                // Serial.print( bufferx);

                // Serial2.println( bufferx);

                break;
            }
            unsigned long now = millis();
            if (now - timeLastInput > TIME_OUT)
            {
                Serial.println("Time out");

                // timeLastInput = now;
                break;
            }
        }
        /*
          Serial.println("end of event");
          int Site = bufferx.indexOf('{', 0);
          Serial.print ("index is : ");
          Serial.println(Site);
          if (Site > 0 ){
          int addr = bufferx.substring(0, Site).toInt();
          Serial.print ("Addr is : ");
          Serial.println(addr);*/
        bool quick_scan_flag = false;
        for (int g = 1; g < 20; g++)
        {
            String str = "A" + String(g);
            String str1 = "B" + String(g);
            if (bufferx == str || bufferx == str1)
            {
                TIME_OUT = _TIME_OUT;
                quick_scan_flag = true;
                Serial.print(bufferx);
                Serial2.print(str);
                Serial2.print('\n');
                str = "";
                // Serial.println(sizeof(bufferx));
                sensortomain();
            }
        }

        if (bufferx == "T")
        {
            for (int g = 1; g < 16; g++)
            {
                String str = "H" + String(g);
                // delay(1);
                Serial2.print(str);
                Serial2.print('\n');
                str = "";

                sensortomain();
            }
            quick_scan_flag = true;
        }
        if (bufferx == "diagnosMode")
        {
            for (int g = 1; g < 16; g++)
            {
                Serial2.print("diagnosMode");
                Serial2.print('\n');
            }
            quick_scan_flag = true;
        }
        if (bufferx == "report")
        {
            Serial2.println("{\"ADDR\":\"99\",\"action\":\"report\"}");
            TIME_OUT = 2000;
            sensortomain();
            quick_scan_flag = true;
        }
        if (quick_scan_flag == false)
        {
            TIME_OUT = 500;
            char json[320];

            bufferx.toCharArray(json, 320);
            StaticJsonDocument<2000> doc;
            DeserializationError error = deserializeJson(doc, json);
            // Serial.println(json);
            // Test if parsing succeeds.
            if (error)
            {
                Serial.print(F("mainboard deserializeJson() failed: "));
                Serial.println(error.f_str());
                return;
            }
            int addr = doc["ADDR"];
            if (ADDR == addr)
            {
                // Serial.println(F("addr flag"));
                if (doc["lightoff"][0] > 0)
                    for (int i = 0; i < 10; i++)
                    {
                        int indexoflight = doc["lightoff"][i];
                        if (indexoflight == 0)
                            break;
                        light(indexoflight, false);
                    }

                if (doc["lighton"][0] > 0)
                    for (int i = 0; i < 10; i++)
                    {
                        int indexoflight = doc["lighton"][i];
                        if (indexoflight == 0)
                            break;
                        light(indexoflight, true);
                        // Serial.println(i);
                        // Serial.println(indexoflight);
                    }
                //  {"ADDR":"0","lighton":[1]}

                if (doc["reset"] == "true")
                {
                    light(0, false);
                    delay(1000);
                    light(0, true);
                    ESP.restart();
                }
            }
            else
            {
                // Serial.println(F("send for sensors "));
                Serial2.println(bufferx);
                bufferx = "";
                sensortomain();
            }
        }
    }
}

void sensortomain()
{
    unsigned long timeLastInput = millis();

    // String bufferx= "";
    // static int index = 0;
    // int value;

    if (Serial2.available() > 0 || (millis() - timeLastInput) < TIME_OUT)
    {

        // char buffer[10];
        //   bufferx= "";
        while (true)
        {
            char x = Serial2.read();

            if (x > 22 && x < 126)
            {
                Serial.print(x);
            }
            else if (x == '\n')
            {

                // buffer[index] = 0;
                // value = atoi(buffer);
                Serial.println();

                // Serial2.println( bufferx);
                //  index = 0;
                if (Serial2.available() == 0)
                {
                    break;
                }
                else
                {
                    timeLastInput = millis();
                }
            }
            unsigned long now = millis();
            if (now - timeLastInput > TIME_OUT)
            {
                Serial.println("sensor Time out");
                //        index = 0;
                // timeLastInput = now;
                break;
            }
        }

        // Serial.println( bufferx);
        //           bufferx= "";
    }
}

void light(int pin, bool state)
{
    // Serial.print("pin is");Serial.println(pin);
    switch (pin)
    {
    case 1:
        pinMode(32, OUTPUT);
        digitalWrite(32, state);
        // ESP.restart();
        // Serial.println("flag");
        break;

    case 2:
        pinMode(33, OUTPUT);
        digitalWrite(33, state);
        // ESP.restart();
        // Serial.println("flag");
        break;
    case 3:
        pinMode(2, OUTPUT);
        digitalWrite(2, state);
        break;

    case 4:
        pinMode(15, OUTPUT);
        digitalWrite(15, state);
        break;

    case 5:
        pinMode(14, OUTPUT);
        digitalWrite(14, state);
        break;
    case 6:
        pinMode(4, OUTPUT);
        digitalWrite(4, state);
        break;
    case 0:
        pinMode(13, OUTPUT);
        digitalWrite(13, 0);
        Serial.println("resrting ");
        delay(2000);
        digitalWrite(13, 1);
        ESP.restart();
        // Serial.println("resrting ");
        break;
    }
}