Untitled
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...