diff --git a/Arduino/Arduino.ino b/Arduino/Arduino.ino new file mode 100644 index 0000000..8a453f7 --- /dev/null +++ b/Arduino/Arduino.ino @@ -0,0 +1,95 @@ +#include +#include "SIM800L.h" + +#define SIM800_RX_PIN 10 +#define SIM800_TX_PIN 11 +#define SIM800_RST_PIN 7 + +SIM800L* sim800l; + +const char APN[] = "TM"; +String BASE_URL = "http://2.238.194.8/index.php?"; +//String BASE_URL = "https://postman-echo.com/get?"; + +String s = ""; +char URL[100]; + + +int anemometerPin = 6; +int anemometerVal = 0; +int anemometerState = 0; +unsigned long anemometerDuration = 0; +unsigned long startime = 0; +unsigned long timer = 0; +int windSpeed = 0; + +int northPin = 4; +int eastPin = 5; +int southPin = 2; +int westPin = 3; + +int timerLimit = 3000;//300000; // 5 minutes + +bool printSensorsData = true; + +String windDirection = ""; + + + +void setup() { + // Initialize Serial Monitor for debugging + Serial.begin(115200); + while(!Serial); + + // Initialize a SoftwareSerial + SoftwareSerial* serial = new SoftwareSerial(SIM800_RX_PIN, SIM800_TX_PIN); + serial->begin(9600); + delay(1000); + + // Initialize SIM800L driver with an internal buffer of 200 bytes and a reception buffer of 512 bytes, debug disabled + sim800l = new SIM800L((Stream *)serial, SIM800_RST_PIN, 200, 512); + + // Setup module for GPRS communication + setupModule(); +} + +void loop() { + + windDirection = ""; + anemometerVal = digitalRead(anemometerPin); + + if ((anemometerState == 1) && (anemometerVal == 0)) { + anemometerDuration = millis() - startime; + startime = millis(); + windSpeed = 2500.0/anemometerDuration; + } + + anemometerState = anemometerVal; + + if(millis() >= timer) { + + Serial.println("--------------------------"); + Serial.println("Sending..."); + + timer = millis() + timerLimit; + + if(digitalRead(northPin)) {windDirection = windDirection + "N";} + if(digitalRead(southPin)) {windDirection = windDirection + "S";} + if(digitalRead(eastPin)) {windDirection = windDirection + "E";} + if(digitalRead(westPin)) {windDirection = windDirection + "W";} + + if(printSensorsData) { + Serial.print("Wind speed:\t"); + Serial.print(windSpeed); + Serial.println("Km/h"); + + Serial.print("Wind direction:\t"); + Serial.println(windDirection); + + } + + sendRequest(); + + } + +} diff --git a/Arduino/GetData.ino b/Arduino/GetData.ino new file mode 100644 index 0000000..cde465a --- /dev/null +++ b/Arduino/GetData.ino @@ -0,0 +1,43 @@ + +void getWind() { + + windDirection = ""; + anemometerVal = digitalRead(anemometerPin); + + //Serial.println(anemometerVal); + + if ((anemometerState == 1) && (anemometerVal == 0)) { + anemometerDuration = millis() - startime; + startime = millis(); + windSpeed = 2500.0/anemometerDuration; + } + + anemometerState = anemometerVal; + + if(millis() >= timer) { + + Serial.println("--------------------------"); + + timer = millis() + timerLimit; + + if(digitalRead(northPin)) {windDirection = windDirection + "N";} + if(digitalRead(southPin)) {windDirection = windDirection + "S";} + if(digitalRead(eastPin)) {windDirection = windDirection + "E";} + if(digitalRead(westPin)) {windDirection = windDirection + "W";} + + if(printSensorsData) { + Serial.print("Wind speed:\t"); + Serial.print(windSpeed); + Serial.println("Km/h"); + + Serial.print("Wind direction:\t"); + Serial.println(windDirection); + + } + + sendRequest(); + //delay(5000); + + } + +} diff --git a/Arduino/Request.ino b/Arduino/Request.ino new file mode 100644 index 0000000..2ba4593 --- /dev/null +++ b/Arduino/Request.ino @@ -0,0 +1,72 @@ + +void sendRequest() { + + s = BASE_URL; + s.concat("windSpeed="); + s.concat(windSpeed); + s.concat("&windDirection="); + s.concat(windDirection); + s.toCharArray(URL, 100); + + Serial.println(URL); + + // Establish GPRS connectivity (5 trials) + bool connected = false; + for(uint8_t i = 0; i < 5 && !connected; i++) { + delay(1000); + connected = sim800l->connectGPRS(); + } + + // Check if connected, if not reset the module and setup the config again + if(connected) { + Serial.println(F("GPRS connected !")); + } else { + Serial.println(F("GPRS not connected !")); + Serial.println(F("Reset the module.")); + sim800l->reset(); + setupModule(); + return; + } + + Serial.println(F("Start HTTP GET...")); + Serial.println(URL); + + // Do HTTP GET communication with 10s for the timeout (read) + uint16_t rc = sim800l->doGet(URL, 10000); + if(rc == 200) { + // Success, output the data received on the serial + Serial.print(F("HTTP GET successful (")); + Serial.print(sim800l->getDataSizeReceived()); + Serial.println(F(" bytes)")); + Serial.print(F("Received : ")); + Serial.println(sim800l->getDataReceived()); + } else { + // Failed... + Serial.print(F("HTTP GET error ")); + Serial.println(rc); + } + + // Close GPRS connectivity (5 trials) + bool disconnected = sim800l->disconnectGPRS(); + for(uint8_t i = 0; i < 5 && !connected; i++) { + delay(1000); + disconnected = sim800l->disconnectGPRS(); + } + + if(disconnected) { + Serial.println(F("GPRS disconnected !")); + } else { + Serial.println(F("GPRS still connected !")); + } + + // Go into low power mode + bool lowPowerMode = sim800l->setPowerMode(MINIMUM); + if(lowPowerMode) { + Serial.println(F("Module in low power mode")); + } else { + Serial.println(F("Failed to switch module to low power mode")); + } + + + windSpeed = 0; +} diff --git a/Arduino/Setup.ino b/Arduino/Setup.ino new file mode 100644 index 0000000..4903c25 --- /dev/null +++ b/Arduino/Setup.ino @@ -0,0 +1,37 @@ + +void setupModule() { + // Wait until the module is ready to accept AT commands + while(!sim800l->isReady()) { + Serial.println(F("Problem to initialize AT command, retry in 1 sec")); + delay(1000); + } + Serial.println(F("Setup Complete!")); + + // Wait for the GSM signal + uint8_t signal = sim800l->getSignal(); + while(signal <= 0) { + delay(1000); + signal = sim800l->getSignal(); + } + Serial.print(F("Signal OK (strenght: ")); + Serial.print(signal); + Serial.println(F(")")); + delay(1000); + + // Wait for operator network registration (national or roaming network) + NetworkRegistration network = sim800l->getRegistrationStatus(); + while(network != REGISTERED_HOME && network != REGISTERED_ROAMING) { + delay(1000); + network = sim800l->getRegistrationStatus(); + } + Serial.println(F("Network registration OK")); + delay(1000); + + // Setup APN for GPRS configuration + bool success = sim800l->setupGPRS(APN); + while(!success) { + success = sim800l->setupGPRS(APN); + delay(5000); + } + Serial.println(F("GPRS config OK")); +}