Untitled

 avatar
unknown
c_cpp
2 years ago
9.4 kB
6
Indexable
//SIMKORT indstillinger

// Pincode for simkortet
#define GSM_PIN "\"1234\""

// GRPRS credentials for simkortet
const char apn[]  = "Telenor Internet";     //SET TO YOUR APN
const char gprsUser[] = "";
const char gprsPass[] = "";

// Nummer til SMS samt besked
#define SMS_TARGET_NOISY  "+REDACTED"
#define SMS_TARGET_PULSE "+REDACTED"
#define SMS_MESSAGE_NOISY "B"
#define SMS_MESSAGE_PULSE "L"

//Netværks indstillinger fra Debugging 1 koden
#define NETWORK_MODE 2
#define PREFFERED_NETWORK_MODE 2


//Modem indstillinger
#define TINY_GSM_MODEM_SIM7600 //Om du bruger SIM7000 eller SIM7600 (TTGO'en er 7600)
#define TINY_GSM_RX_BUFFER 1024 // Set RX buffer to 1Kb
#define SerialAT Serial1

//Libraries
#define DUMP_AT_COMMANDS  //Bruges til debugging

#include <TinyGsmClient.h>
#include <SPI.h>
#include <SD.h>
#include <Ticker.h>


#ifdef DUMP_AT_COMMANDS  // if enabled it requires the streamDebugger lib
  #include <StreamDebugger.h>
  StreamDebugger debugger(SerialAT, Serial);
  TinyGsm modem(debugger);
#else
  TinyGsm modem(SerialAT);
#endif

//ESP32-Modem Forbindelser Indstillinger
#define uS_TO_S_FACTOR 1000000ULL  // Conversion factor for micro seconds to seconds

#define UART_BAUD   115200
#define PIN_DTR     25
#define PIN_TX      27
#define PIN_RX      26
#define PWR_PIN     4

//SD Kort forbindelser
#define SD_MISO     2
#define SD_MOSI     15
#define SD_SCLK     14
#define SD_CS       13
#define LED_PIN     12

int counter, lastIndex, numberOfPieces = 24;
String pieces[24], input;

//Indstillinger for dBAMåleren
#define VREF 3.3 //Voltagen som din MCU bruger, Arduino = 5
#define soundSensorPin 25 //Den pin på MCU'en, der er forbundet til outputtet på dBA måleren
#define analogMaxRange 4096 //Analog max range for din MCU, esp32: 4096, Arduino: 1023

//Funktionelle indstillinger
#define dBAMax 3.0 //Hvornår der skal sendes en SMS
#define errorMeasurement 0.0 //Fejlmarginen
#define waitBeforeSendingtext (10*1000) //Målt i millisekunder, tid før vi sender noisySMS
#define waitBeforeGoingIdle (100*1000) //Hvor lang tid dBAMeasurement må være under vores dBAMax, før vi går tilbage til idle stadiet
#define waitIntervalBetweenPulseText (1000*1000) //Antal millisekunder i mellem, at vi sender en pulse SMS



//Variable vedrørende FSMD'en - MÅ IKKE ÆNDRES
//States:
//Idle 0, dBA above Max 1, dBA momentarily below max 2, send noisy text 3, send pulse text 4
int state = 0; //Initialiserer stadiet ved 0
float dbAMeasurement;
unsigned long timeSinceLastIdle; //Bruges til at triggere loudSMS
unsigned long timeSinceLastPulse = 0; //Bruges til at pulseSMS
unsigned long timeSincedBAMax; //Tid der er gået siden, vi optog vores første dBAMax i denne omgang
  
//Funktioner

void sendText(String SMSTarget,String message,TinyGsm modem){
    modem.sendSMS(SMSTarget, message);
}

float getdBAMeasurement(){
  float dbAMeasurement = ((analogRead(soundSensorPin) / 4096.0 * VREF)*50.0); //Slipper for at bruge clock cycluser på at definere variable
  delay(125); //Sampling cyclus delay for stabilitet
  return dbAMeasurement;
} 

bool isAbovedBAThreshold(){
  float dbAMeasurement = getdBAMeasurement();
  if(dbAMeasurement>(dBAMax - errorMeasurement)){
    return true;
  }else{
    return false;
  }
}

void setup() {
  Serial.begin(115200);

  //Opstart af Modem
  // Set LED OFF
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, HIGH);

  pinMode(PWR_PIN, OUTPUT);
  digitalWrite(PWR_PIN, HIGH);
  delay(300);
  digitalWrite(PWR_PIN, LOW);

  //Tjekker for SD kort
  SPI.begin(SD_SCLK, SD_MISO, SD_MOSI, SD_CS);
  if (!SD.begin(SD_CS)) {
    Serial.println("SDCard MOUNT FAIL");
  } else {
    uint32_t cardSize = SD.cardSize() / (1024 * 1024);
    String str = "SDCard Size: " + String(cardSize) + "MB";
    Serial.println(str);
  }

  Serial.println("\nWait...");

  delay(1000);

  SerialAT.begin(UART_BAUD, SERIAL_8N1, PIN_RX, PIN_TX);

  // Restart takes quite some time
  // To skip it, call init() instead of restart()
  Serial.println("Initializing modem...");
  if (!modem.restart()) {
    Serial.println("Failed to restart modem, attempting to continue without restarting");
  }

  
  // Unlock your SIM card with a PIN if needed
  if ( GSM_PIN && modem.getSimStatus() != 3 ) {
      modem.simUnlock(GSM_PIN);
  }
  modem.sendAT("+CFUN=0 ");
  if (modem.waitResponse(10000L) != 1) {
    DBG(" +CFUN=0  false ");
  }
  delay(200);

  /*
    2 Automatic
    13 GSM only
    38 LTE only
    51 GSM and LTE only
  * * * */
  String res;
  // CHANGE NETWORK MODE, IF NEEDED
  res = modem.setNetworkMode(NETWORK_MODE);
  if (res != "1") {
    DBG("setNetworkMode  false ");
    return ;
  }
  delay(200);

  /*
    1 CAT-M
    2 NB-Iot
    3 CAT-M and NB-IoT
  * * */
  // CHANGE PREFERRED MODE, IF NEEDED
  res = modem.setNetworkMode(PREFFERED_NETWORK_MODE);
  if (res != "1") {
    DBG("setPreferredMode  false ");
    return ;
  }
  delay(200);

  /*AT+CBANDCFG=<mode>,<band>[,<band>…]
   * <mode> "CAT-M"   "NB-IOT"
   * <band>  The value of <band> must is in the band list of getting from  AT+CBANDCFG=?
   * For example, my SIM card carrier "NB-iot" supports B8.  I will configure +CBANDCFG= "Nb-iot ",8
   */
  /* modem.sendAT("+CBANDCFG=\"NB-IOT\",8 ");*/
  
  /* if (modem.waitResponse(10000L) != 1) {
       DBG(" +CBANDCFG=\"NB-IOT\" ");
   }*/
   delay(200);

  modem.sendAT("+CFUN=1 ");
  if (modem.waitResponse(10000L) != 1) {
    DBG(" +CFUN=1  false ");
  }
  delay(200);

  SerialAT.println("AT+CGDCONT?");
  delay(500);
  if (SerialAT.available()) {
    input = SerialAT.readString();
    for (int i = 0; i < input.length(); i++) {
      if (input.substring(i, i + 1) == "\n") {
        pieces[counter] = input.substring(lastIndex, i);
        lastIndex = i + 1;
        counter++;
       }
        if (i == input.length() - 1) {
          pieces[counter] = input.substring(lastIndex, i);
        }
      }
      // Reset for reuse
      input = "";
      counter = 0;
      lastIndex = 0;

      for ( int y = 0; y < numberOfPieces; y++) {
        for ( int x = 0; x < pieces[y].length(); x++) {
          char c = pieces[y][x];  //gets one byte from buffer
          if (c == ',') {
            if (input.indexOf(": ") >= 0) {
              String data = input.substring((input.indexOf(": ") + 1));
              if ( data.toInt() > 0 && data.toInt() < 25) {
                modem.sendAT("+CGDCONT=" + String(data.toInt()) + ",\"IP\",\"" + String(apn) + "\",\"0.0.0.0\",0,0,0,0");
              }
              input = "";
              break;
            }
          // Reset for reuse
          input = "";
         } else {
          input += c;
         }
      }
    }
  } else {
    Serial.println("Failed to get PDP!");
  }

  Serial.println("\n\n\nWaiting for network...");
  if (!modem.waitForNetwork()) {
    delay(10000);
    return;
  }

  if (modem.isNetworkConnected()) {
    Serial.println("Network connected");
  }

}

void loop() {

  switch(state){
    case 0:  // Idle: Venter på at dbAMeasurement går over dbAMax - Error
      Serial.println("Back in state 0");
      dbAMeasurement = getdBAMeasurement();
      timeSinceLastIdle = millis(); //Millisekunder siden start
      Serial.println(dbAMeasurement);
      Serial.println(timeSinceLastIdle);
      Serial.println(timeSinceLastPulse);

      if((timeSinceLastIdle - timeSinceLastPulse) > waitIntervalBetweenPulseText){ //Vi vil hellere sende pulse SMS'en, før vi advarer
        state = 4;
      }
      if ((dbAMeasurement>(dBAMax - errorMeasurement))&(state != 4)){ //If we go above the allowed dBAMeasurement, we start counting until we send noisySMS
        state = 1;
      }

      break;
    case 1:  // We're counting up to sending the loudSMS
      Serial.println("Back in state 1");

      dbAMeasurement = getdBAMeasurement();
      Serial.println(dbAMeasurement);

      timeSincedBAMax = millis() - timeSinceLastIdle;
      Serial.println(timeSincedBAMax);
      if(timeSincedBAMax>waitBeforeSendingtext){
        state = 3; //SendnoisySMS
      }
      if(dbAMeasurement<(dBAMax - errorMeasurement)){
        state = 2; //Momentært under dBAMax
      }

      break;
    case 2:  // Hvis vi momentært går under dBAMax
      Serial.println("Back in state 2");
      dbAMeasurement = getdBAMeasurement();
      
      if((millis() - timeSincedBAMax)> waitBeforeGoingIdle){ //Når der er gået lang nok tid, hvor vi ikke måler en høj nok lyd, så genstarter vi timeren for at sende noisySMS
        state = 0;
      }

      if(dbAMeasurement>(dBAMax - errorMeasurement)){ //Vi går igen over vores threshold og går tilbage til tælle op til at sende noisySMS uden at genstarte timeren
        state = 1;
      }
      

      break;
    case 3:  // Send noisySMS
      sendText(SMS_TARGET_NOISY,SMS_MESSAGE_NOISY,modem);
      Serial.println("Back in state 3");
      state = 0;
      break;

    case 4:
      Serial.println("Back in state 4");
      timeSinceLastPulse = millis();
      sendText(SMS_TARGET_PULSE,SMS_MESSAGE_PULSE,modem);
      state = 0; //Go back to idle
      break;
  }
}

Editor is loading...