├── .gitattributes └── TTGOTCALL ├── utilities.h └── TTGOTCALL.ino /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /TTGOTCALL/utilities.h: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | #include 5 | 6 | #if defined(SIM800L_IP5306_VERSION_20190610) 7 | 8 | #define MODEM_RST 5 9 | #define MODEM_PWRKEY 4 10 | #define MODEM_POWER_ON 23 11 | #define MODEM_TX 27 12 | #define MODEM_RX 26 13 | 14 | #define I2C_SDA 21 15 | #define I2C_SCL 22 16 | #define LED_GPIO 13 17 | #define LED_ON HIGH 18 | #define LED_OFF LOW 19 | 20 | #define IP5306_ADDR 0x75 21 | #define IP5306_REG_SYS_CTL0 0x00 22 | 23 | // setPowerBoostKeepOn 24 | bool setupPMU() 25 | { 26 | bool en = true; 27 | Wire.begin(I2C_SDA, I2C_SCL); 28 | Wire.beginTransmission(IP5306_ADDR); 29 | Wire.write(IP5306_REG_SYS_CTL0); 30 | if (en) { 31 | Wire.write(0x37); // Set bit1: 1 enable 0 disable boost keep on 32 | } else { 33 | Wire.write(0x35); // 0x37 is default reg value 34 | } 35 | return Wire.endTransmission() == 0; 36 | } 37 | 38 | 39 | #elif defined(SIM800L_AXP192_VERSION_20200327) 40 | 41 | #define MODEM_RST 5 42 | #define MODEM_PWRKEY 4 43 | #define MODEM_POWER_ON 23 44 | #define MODEM_TX 27 45 | #define MODEM_RX 26 46 | #define MODEM_DTR 32 47 | #define MODEM_RI 33 48 | 49 | #define I2C_SDA 21 50 | #define I2C_SCL 22 51 | #define LED_GPIO 13 52 | #define LED_ON HIGH 53 | #define LED_OFF LOW 54 | 55 | 56 | #elif defined(SIM800C_AXP192_VERSION_20200609) 57 | // pin definitions 58 | #define MODEM_PWRKEY 4 59 | #define MODEM_POWER_ON 25 60 | #define MODEM_TX 27 61 | #define MODEM_RX 26 62 | #define MODEM_DTR 32 63 | #define MODEM_RI 33 64 | 65 | #define I2C_SDA 21 66 | #define I2C_SCL 22 67 | #define LED_GPIO 12 68 | #define LED_ON LOW 69 | #define LED_OFF HIGH 70 | 71 | #elif defined(SIM800L_IP5306_VERSION_20200811) 72 | 73 | 74 | #define MODEM_RST 5 75 | #define MODEM_PWRKEY 4 76 | #define MODEM_POWER_ON 23 77 | #define MODEM_TX 27 78 | #define MODEM_RX 26 79 | 80 | #define MODEM_DTR 32 81 | #define MODEM_RI 33 82 | 83 | #define I2C_SDA 21 84 | #define I2C_SCL 22 85 | #define LED_GPIO 13 86 | #define LED_ON HIGH 87 | #define LED_OFF LOW 88 | 89 | #define IP5306_ADDR 0x75 90 | #define IP5306_REG_SYS_CTL0 0x00 91 | 92 | // setPowerBoostKeepOn 93 | bool setupPMU() 94 | { 95 | bool en = true; 96 | Wire.begin(I2C_SDA, I2C_SCL); 97 | Wire.beginTransmission(IP5306_ADDR); 98 | Wire.write(IP5306_REG_SYS_CTL0); 99 | if (en) { 100 | Wire.write(0x37); // Set bit1: 1 enable 0 disable boost keep on 101 | } else { 102 | Wire.write(0x35); // 0x37 is default reg value 103 | } 104 | return Wire.endTransmission() == 0; 105 | } 106 | 107 | #else 108 | 109 | #error "Please select the corresponding model" 110 | 111 | #endif 112 | 113 | 114 | #if defined(SIM800L_AXP192_VERSION_20200327) || defined(SIM800C_AXP192_VERSION_20200609) 115 | #include //https://github.com/lewisxhe/AXP202X_Library 116 | 117 | AXP20X_Class axp; 118 | 119 | bool setupPMU() 120 | { 121 | // For more information about the use of AXP192, please refer to AXP202X_Library https://github.com/lewisxhe/AXP202X_Library 122 | Wire.begin(I2C_SDA, I2C_SCL); 123 | int ret = axp.begin(Wire, AXP192_SLAVE_ADDRESS); 124 | 125 | if (ret == AXP_FAIL) { 126 | Serial.println("AXP Power begin failed"); 127 | return false; 128 | } 129 | 130 | //! Turn off unused power 131 | axp.setPowerOutPut(AXP192_DCDC1, AXP202_OFF); 132 | axp.setPowerOutPut(AXP192_LDO2, AXP202_OFF); 133 | axp.setPowerOutPut(AXP192_LDO3, AXP202_OFF); 134 | axp.setPowerOutPut(AXP192_DCDC2, AXP202_OFF); 135 | axp.setPowerOutPut(AXP192_EXTEN, AXP202_OFF); 136 | 137 | //! Do not turn off DC3, it is powered by esp32 138 | // axp.setPowerOutPut(AXP192_DCDC3, AXP202_ON); 139 | 140 | // Set the charging indicator to turn off 141 | // Turn it off to save current consumption 142 | // axp.setChgLEDMode(AXP20X_LED_OFF); 143 | 144 | // Set the charging indicator to flash once per second 145 | // axp.setChgLEDMode(AXP20X_LED_BLINK_1HZ); 146 | 147 | 148 | //! Use axp192 adc get voltage info 149 | axp.adc1Enable(AXP202_VBUS_VOL_ADC1 | AXP202_VBUS_CUR_ADC1 | AXP202_BATT_CUR_ADC1 | AXP202_BATT_VOL_ADC1, true); 150 | 151 | float vbus_v = axp.getVbusVoltage(); 152 | float vbus_c = axp.getVbusCurrent(); 153 | float batt_v = axp.getBattVoltage(); 154 | // axp.getBattPercentage(); // axp192 is not support percentage 155 | Serial.printf("VBUS:%.2f mV %.2f mA ,BATTERY: %.2f\n", vbus_v, vbus_c, batt_v); 156 | 157 | return true; 158 | } 159 | 160 | #endif 161 | 162 | 163 | 164 | void setupModem() 165 | { 166 | 167 | // Start power management 168 | if (setupPMU() == false) { 169 | Serial.println("Setting power error"); 170 | } 171 | 172 | #ifdef MODEM_RST 173 | // Keep reset high 174 | pinMode(MODEM_RST, OUTPUT); 175 | digitalWrite(MODEM_RST, HIGH); 176 | #endif 177 | 178 | pinMode(MODEM_PWRKEY, OUTPUT); 179 | pinMode(MODEM_POWER_ON, OUTPUT); 180 | 181 | // Turn on the Modem power first 182 | digitalWrite(MODEM_POWER_ON, HIGH); 183 | 184 | // Pull down PWRKEY for more than 1 second according to manual requirements 185 | digitalWrite(MODEM_PWRKEY, HIGH); 186 | delay(100); 187 | digitalWrite(MODEM_PWRKEY, LOW); 188 | delay(1000); 189 | digitalWrite(MODEM_PWRKEY, HIGH); 190 | 191 | // Initialize the indicator as an output 192 | pinMode(LED_GPIO, OUTPUT); 193 | digitalWrite(LED_GPIO, LED_OFF); 194 | } 195 | -------------------------------------------------------------------------------- /TTGOTCALL/TTGOTCALL.ino: -------------------------------------------------------------------------------- 1 | /************************************************************** 2 | 3 | For this example, you need to install Blynk library: 4 | https://github.com/blynkkk/blynk-library/releases/latest 5 | 6 | TinyGSM Getting Started guide: 7 | https://tiny.cc/tinygsm-readme 8 | 9 | ************************************************************** 10 | 11 | Blynk is a platform with iOS and Android apps to control 12 | Arduino, Raspberry Pi and the likes over the Internet. 13 | You can easily build graphic interfaces for all your 14 | projects by simply dragging and dropping widgets. 15 | 16 | Blynk supports many development boards with WiFi, Ethernet, 17 | GSM, Bluetooth, BLE, USB/Serial connection methods. 18 | See more in Blynk library examples and community forum. 19 | 20 | http://www.blynk.io/ 21 | 22 | Change GPRS apm, user, pass, and Blynk auth token to run :) 23 | **************************************************************/ 24 | 25 | #define BLYNK_PRINT Serial // Comment this out to disable prints and save space 26 | 27 | // Default heartbeat interval for GSM is 60 28 | // If you want override this value, uncomment and set this option: 29 | // #define BLYNK_HEARTBEAT 30 30 | 31 | // Please select the corresponding model 32 | 33 | #define SIM800L_IP5306_VERSION_20190610 34 | // #define SIM800L_AXP192_VERSION_20200327 35 | // #define SIM800C_AXP192_VERSION_20200609 36 | // #define SIM800L_IP5306_VERSION_20200811 37 | 38 | #include "utilities.h" 39 | 40 | #define S1 21 41 | #define relay1 25 42 | 43 | #define S2 19 44 | #define relay2 14 45 | 46 | #define S3 18 47 | #define relay3 33 48 | 49 | #define S4 22 50 | #define relay4 13 51 | 52 | // Select your modem: 53 | #define TINY_GSM_MODEM_SIM800 54 | 55 | // Set serial for debug console (to the Serial Monitor, default speed 115200) 56 | #define SerialMon Serial 57 | 58 | // Set serial for AT commands (to the module) 59 | // Use Hardware Serial on Mega, Leonardo, Micro 60 | #define SerialAT Serial1 61 | 62 | // See all AT commands, if wanted 63 | //#define DUMP_AT_COMMANDS 64 | 65 | // Define the serial console for debug prints, if needed 66 | #define TINY_GSM_DEBUG SerialMon 67 | 68 | // set GSM PIN, if any 69 | #define GSM_PIN "" 70 | 71 | // Your GPRS credentials, if any 72 | const char apn[] = "ENTER_YOUR_APN"; // search for apn of your network provider on Google 73 | const char gprsUser[] = ""; 74 | const char gprsPass[] = ""; 75 | 76 | #include 77 | #include 78 | 79 | #ifdef DUMP_AT_COMMANDS 80 | #include 81 | StreamDebugger debugger(SerialAT, SerialMon); 82 | TinyGsm modem(debugger); 83 | #else 84 | TinyGsm modem(SerialAT); 85 | #endif 86 | TinyGsmClient client(modem); 87 | 88 | int switch_ON_Flag1_previous_I = 0; 89 | int switch_ON_Flag1_previous_II = 0; 90 | int switch_ON_Flag1_previous_III = 0; 91 | int switch_ON_Flag1_previous_IV = 0; 92 | 93 | // You should get Auth Token in the Blynk App. 94 | // Go to the Project Settings (nut icon). 95 | const char auth[] = "AUTH_TOKE"; 96 | 97 | 98 | BLYNK_WRITE(V1) 99 | { 100 | int pinValue = param.asInt(); // assigning incoming value from pin V1 to a variable 101 | digitalWrite(relay1, !pinValue); 102 | delay(1000); 103 | // process received value 104 | } 105 | 106 | BLYNK_WRITE(V2) 107 | { 108 | int pinValue = param.asInt(); // assigning incoming value from pin V1 to a variable 109 | digitalWrite(relay2, !pinValue); 110 | // process received value 111 | } 112 | 113 | BLYNK_WRITE(V3) 114 | { 115 | int pinValue = param.asInt(); // assigning incoming value from pin V1 to a variable 116 | digitalWrite(relay3, !pinValue); 117 | // process received value 118 | } 119 | 120 | BLYNK_WRITE(V4) 121 | { 122 | int pinValue = param.asInt(); // assigning incoming value from pin V1 to a variable 123 | digitalWrite(relay4, !pinValue); 124 | // process received value 125 | } 126 | void setup() 127 | { 128 | // Set console baud rate 129 | SerialMon.begin(115200); 130 | 131 | pinMode(S1, INPUT_PULLUP); 132 | pinMode(relay1, OUTPUT); 133 | 134 | pinMode(S2, INPUT_PULLUP); 135 | pinMode(relay2, OUTPUT); 136 | 137 | pinMode(S3, INPUT_PULLUP); 138 | pinMode(relay3, OUTPUT); 139 | 140 | pinMode(S4, INPUT_PULLUP); 141 | pinMode(relay4, OUTPUT); 142 | 143 | digitalWrite(relay1, HIGH); 144 | digitalWrite(relay2, HIGH); 145 | digitalWrite(relay3, HIGH); 146 | digitalWrite(relay4, HIGH); 147 | 148 | delay(10); 149 | 150 | setupModem(); 151 | 152 | SerialMon.println("Wait..."); 153 | 154 | // Set GSM module baud rate and UART pins 155 | SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX); 156 | 157 | delay(6000); 158 | 159 | // Restart takes quite some time 160 | // To skip it, call init() instead of restart() 161 | SerialMon.println("Initializing modem..."); 162 | modem.restart(); 163 | // modem.init(); 164 | 165 | String modemInfo = modem.getModemInfo(); 166 | SerialMon.print("Modem Info: "); 167 | SerialMon.println(modemInfo); 168 | 169 | // Unlock your SIM card with a PIN 170 | //modem.simUnlock("1234"); 171 | 172 | Blynk.begin(auth, modem, apn, gprsUser, gprsPass); 173 | 174 | } 175 | 176 | void loop() 177 | { 178 | Blynk.run(); 179 | Switch(); 180 | } 181 | 182 | void Switch() 183 | { 184 | if (digitalRead(S1) == LOW) 185 | { 186 | if (switch_ON_Flag1_previous_I == 0 ) 187 | { 188 | digitalWrite(relay1, LOW); 189 | Serial.println("Relay1 ON"); 190 | Blynk.virtualWrite(V1, 1); 191 | switch_ON_Flag1_previous_I = 1; 192 | } 193 | Serial.println("Switch1 ON"); 194 | 195 | } 196 | if (digitalRead(S1) == HIGH ) 197 | { 198 | if (switch_ON_Flag1_previous_I == 1) 199 | { 200 | digitalWrite(relay1, HIGH); 201 | Serial.println("Relay1 OFF"); 202 | Blynk.virtualWrite(V1, 0); 203 | switch_ON_Flag1_previous_I = 0; 204 | } 205 | Serial.println("Switch1 OFF"); 206 | } 207 | 208 | 209 | if (digitalRead(S2) == LOW) 210 | { 211 | if (switch_ON_Flag1_previous_II == 0 ) 212 | { 213 | digitalWrite(relay2, LOW); 214 | Serial.println("Relay2 ON"); 215 | Blynk.virtualWrite(V2, 1); 216 | switch_ON_Flag1_previous_II = 1; 217 | } 218 | Serial.println("Switch2 ON"); 219 | 220 | } 221 | if (digitalRead(S2) == HIGH ) 222 | { 223 | if (switch_ON_Flag1_previous_II == 1) 224 | { 225 | digitalWrite(relay2, HIGH); 226 | Serial.println("Relay2 OFF"); 227 | Blynk.virtualWrite(V2, 0); 228 | switch_ON_Flag1_previous_II = 0; 229 | } 230 | Serial.println("Switch2 OFF"); 231 | } 232 | 233 | 234 | if (digitalRead(S3) == LOW) 235 | { 236 | if (switch_ON_Flag1_previous_III == 0 ) 237 | { 238 | digitalWrite(relay3, LOW); 239 | Serial.println("Relay3 ON"); 240 | Blynk.virtualWrite(V3, 1); 241 | switch_ON_Flag1_previous_III = 1; 242 | } 243 | Serial.println("Switch3 ON"); 244 | 245 | } 246 | if (digitalRead(S3) == HIGH ) 247 | { 248 | if (switch_ON_Flag1_previous_III == 1) 249 | { 250 | digitalWrite(relay3, HIGH); 251 | Serial.println("Relay3 OFF"); 252 | Blynk.virtualWrite(V3, 0); 253 | switch_ON_Flag1_previous_III = 0; 254 | } 255 | Serial.println("Switch3 OFF"); 256 | } 257 | 258 | 259 | if (digitalRead(S4) == LOW) 260 | { 261 | if (switch_ON_Flag1_previous_IV == 0 ) 262 | { 263 | digitalWrite(relay4, LOW); 264 | Serial.println("Relay4 ON"); 265 | Blynk.virtualWrite(V4, 1); 266 | switch_ON_Flag1_previous_IV = 1; 267 | } 268 | Serial.println("Switch4 ON"); 269 | 270 | } 271 | if (digitalRead(S4) == HIGH ) 272 | { 273 | if (switch_ON_Flag1_previous_IV == 1) 274 | { 275 | digitalWrite(relay4, HIGH); 276 | Serial.println("Relay4 OFF"); 277 | Blynk.virtualWrite(V4, 0); 278 | switch_ON_Flag1_previous_IV = 0; 279 | } 280 | Serial.println("Switch4 OFF"); 281 | } 282 | 283 | 284 | } 285 | --------------------------------------------------------------------------------