Test

Dependencies:   mbed as3935 ESP8266NodeMCUInterface

main.cpp

Committer:
starmanultra
Date:
2020-11-09
Revision:
3:c69be808548f
Parent:
1:5508e5a66441

File content as of revision 3:c69be808548f:

/*
Authors: Brian Harden + Stefan Abi-Karam + Larry Kresse
Class: ECE4180 - Fall 2020
Description: The purpose of this program is to set up a single mbed device

BRIAN'S mBED MAC ADDRESS:   00:02:f7:f3:64:9f
BORROWED mBED MAC ADDRESS:  00:02:F7:F3:D2:C5
MAIN ESP8266 IP ADDRESS:    143.215.99.29
BORROWED mBED IP ADDRESS:   143.215.104.115
MAIN ESP8266 MAC ADDRESS:   18-FE-34-05-99-F8
BORROW ESP8266 MAC ADDRESS: 18-FE-34-0D-CB-40

*/


#include <string>
#include "mbed.h"
#include "ESP8266.h"
#include "AS3935.h"

#define LIGHTNINGDETECTORID 1

//DECLARATIONS: STRUCTS
// Struct to send over TCP
struct DATA
{
    char detectorID;
    char distanceKM;
    unsigned long time;
};

union rawReceivedData
{
    struct DATA struc;
    char dataString[sizeof(DATA)];
};

//using namespace std::chrono
//DECLARATIONS: GLOBAL VARIABLES
DigitalOut led1(LED1);                                                          //DEBUGGING: On-board LED used for debugging purposes
DigitalOut led2(LED2);                                                          //DEBUGGING: On-board LED used for debugging purposes
DigitalOut led4(LED4);                                                          //DEBUGGING: On-board LED used for debugging purposes
char dataTEMP[8] = "5";                                                         //DEBUGGING: A buffer to store the incoming data
Serial pc(USBTX, USBRX);                                                        //Set up the mbed USB port for debugging/monitoring
Timer clocky;                                                                    //A clock used to log the time of each lightning strike
ESP8266 wifi(p28, p27, p26, 9600, 3000);                                        //The WiFi module
AS3935 ld(p11, p12, p13, p14, "ld", 2000000);                                   //MOSI, MISO, SCK, CS, SPI bus freq (hz)
InterruptIn as3935INT(p15);                                                     //Interrupt signal that is given by the AS3935 Lightning Detector
DigitalOut wifiRST(p26);                                                        //Reset signal to the ESP8266 Device
char ssid[32] = "GTother";                                                      //enter WiFi router ssid inside the quotes
char pwd [32] = "GeorgeP@1927";                                                 //enter WiFi router password inside the quotes
char serverIP [32] = "143.215.99.29";                                           //The server IP to connect to (the main mBed)
//char serverIP [32] = "143.215.104.115";                                       //The server IP to connect to (the main mBed)
Timer timeoutTimer;                                                             //A timer in case of ESP8266 timeouts
unsigned int timeout;                                                           //A maximum time (in seconds) before timeout
int county;                                                                     //A counter for timeouts in the ESP8266
bool ended;                                                                     //A boolean letting us know when the ESP8266's role is terminated
union rawReceivedData dataToSend;                                                  //A struct to send over TCP to the server


//DECLARATIONS: FUNCTION PROTOTYPES
void LightningDetected();                                                       //Interrupt routine to handle the event of lightning occurring
void SetupTransmitter();                                                        //Sets up the WiFi card for transmitting
void SetupLightningDetector();                                                  //Sets up the AS3935 lightning detector
void dev_recv();                                                                //DEBUGGING: Write out any errors that may occur within the WiFi module
void pc_recv();                                                                 //DEBUGGING: Write out any errors that may occur within the WiFi module

/*******************************************************************************
MAIN FUNCTION
*******************************************************************************/

int main() 
{
    wifiRST = 0;                                                                //Reset the ESP8266
    wait(0.5);                                                                  //Give it a little time to fully reset
    wifiRST = 1;                                                                //Raise the reset pin
    wait(1);                                                                    //Give it a second to re-initialize
    //Set up the transmitter
    SetupTransmitter();
    //Initialize the lightning detector
    SetupLightningDetector();
    pc.printf("Ready!\r\n");
    clocky.start();
    dataToSend.struc.distanceKM = 5;
    dataToSend.struc.detectorID = 1;
    dataToSend.struc.time = 0x0F;
    while(1) 
    {
        //Blinky
        pc.printf("Test packet send!");
        wifi.send((char *)dataToSend.dataString, sizeof(DATA));                            //Send the data
        wait(3);
        led1 = !led1;
        //sleep(1);
    }
}

/**************************
LIGHTNING DETECTED
***************************/
//Summary: The AS3935 breakout board will send the INT signal high when it
// detects lightning. This interrupt function is designed to handle the
// interrupt in the event of lightning being detected
void LightningDetected()
{
    clocky.stop();
    led1 = 1;
    char OriginInt;
    wait_ms(2);
    OriginInt = ld.interruptSource();
    if (OriginInt == 1) 
    { //
        pc.printf(" Noise level too high\r\n");
    }
    if (OriginInt == 4) 
    { //
        pc.printf(" Disturber\r\n");
    }
    if (OriginInt == 8) 
    { // detection
        // pc.printf(" Lightning detection\r\n");
        dataTEMP[0] = ld.lightningDistanceKm();                                 //Shove the distance into index 0
        dataToSend.struc.distanceKM = dataTEMP[0];                                    //Shove the distance into the struct
        pc.printf("Lightning detection, distance=%dm\r\n", dataTEMP[0]);
        pc.printf("Energy %d\r\n", ld.getEnergy());
        ld.clearStats();                                                        //Clear the contents and get 
    }
    dataTEMP[1] = (char)LIGHTNINGDETECTORID;                                    //Shove the detector's ID into index 1
    dataToSend.struc.detectorID = (char)LIGHTNINGDETECTORID;                          //Shove thed etector's dsitance into the struct
    dataToSend.struc.time = clocky.read();                                            //Shove the time in milliseconds into the struct
    wait(0.5);
    //wifi.send((char *)dataToSend.dataString, sizeof(DATA));                                //Send the data
    clocky.start();                                                             //Start the clock again
    
    //TODO: Send the struct
    
}

/**************************
SETUP - ESP8266 WIFI MODULE
***************************/
//Summary: This function will set up the transmitting ESP8266 module so that
// it will send data to the corresponding ESP8266 server with the interrupt
// data
void SetupTransmitter()
{
    wifi.init();                                                                //Initialize the ESP8266 module (using resets contained in the class)
    wifi.connect(ssid, pwd);                                                    //Connect using the SSID and Password
    //Keep re-trying to gain a connection to an access point
    while(!(wifi.is_connected()))
    {
        wait(2);
        pc.printf("Connecting to AP...\r\n");
    }
    //Keep re-trying to connect to the main device
    while(!(wifi.open(true, serverIP, 80, -1)))
    {
        wait(2);
        pc.printf("Connecting to server...\r\n");
    }
}

/**************************
SETUP - AS3935 LIGHTNING DETECTOR
***************************/
//Summary: This function sets up the lightning detector so that it may handle
// lightning strikes
void SetupLightningDetector()
{
    ld.setTuneCap(1);                                                           //500kHz
    ld.setOutdoors();                                                           //Scale it for indoors experiments
    ld.setMinimumLightnings(1);                                                 //Set it so it only needs one lightning strike to trigger
    ld.setNoiseFloor(2);                                                        
    ld.disableDisturbers();                                                     //Stop making it whine about noise
    ld.setWatchdogThreshold(2);                                                 //2 Second watchdog
    as3935INT.rise(&LightningDetected);                                         //Set it so that the interrupt function goes high when lightning is detected
}

/**************************
DEBUGGING - Receiving ESP8266 Data
***************************/
//Summary: This function will emplace any characters received by the
// ESP8266 module to the PC terminal
void dev_recv()
{
    led1 = !led1;
    wait(0.5);
    while(wifi.readable()) 
    {
        pc.putc(wifi.getc());                                                   //Emplace characters from the ESP8266 to the PC
    }
}

/**************************
DEBUGGING - Placing ESP8266 Data
***************************/
//Summary: This function will emplace any characters sent from the PC
// terminal into the ESP8266 module
void pc_recv()
{
    led4 = !led4;
    while(pc.readable()) 
    {
        wifi.putc(pc.getc());                                                   //Emplace characters from the PC to the ESP8266
    }
}