From 8e76200894d8ba36df97cef1ad8a4fbebba978d2 Mon Sep 17 00:00:00 2001 From: Eric Date: Thu, 2 Mar 2023 09:46:22 -0800 Subject: [PATCH] T-SIMCAM, Upload images anywhere with an 4G LTE modem. --- .../01_T-SIMCAM_ImageUploader.ino | 213 ++++++++++++++++++ .../01_T-SIMCAM_ImageUploader/config.h | 46 ++++ 2 files changed, 259 insertions(+) create mode 100755 Cellular/T-SIMCAM/01_T-SIMCAM_ImageUploader/01_T-SIMCAM_ImageUploader.ino create mode 100755 Cellular/T-SIMCAM/01_T-SIMCAM_ImageUploader/config.h diff --git a/Cellular/T-SIMCAM/01_T-SIMCAM_ImageUploader/01_T-SIMCAM_ImageUploader.ino b/Cellular/T-SIMCAM/01_T-SIMCAM_ImageUploader/01_T-SIMCAM_ImageUploader.ino new file mode 100755 index 0000000..a528019 --- /dev/null +++ b/Cellular/T-SIMCAM/01_T-SIMCAM_ImageUploader/01_T-SIMCAM_ImageUploader.ino @@ -0,0 +1,213 @@ +///////////////////////////////////////////////////////////////// +/* + T-SIMCAM, Upload images anywhere with an 4G LTE modem. + For More Information: https://youtu.be/kOYJ-4oZ8Ws + Created by Eric N. (ThatProject) +*/ +///////////////////////////////////////////////////////////////// + +/*Verison*/ +//ESP32 Arduino 2.0.7 +//TinyGSM 0.11.5 + +#define TINY_GSM_MODEM_SIM7600 +#include "config.h" +#include "esp_camera.h" +#include +#include + +const char server[] = "34.127.93.100"; +const char resource[] = "/upload"; +const int port = 3000; + +#define CHUNK_SIZE 1500 +#define TINY_GSM_USE_GPRS true + +const char apn[] = "h2g2"; +const char gprsUser[] = ""; +const char gprsPass[] = ""; + +TinyGsm modem(Serial1); +TinyGsmClient client(modem, 0); + +void setup() { + Serial.begin(115200); + Serial.setDebugOutput(true); + Serial.println(); + + pinMode(PWR_ON_PIN, OUTPUT); + digitalWrite(PWR_ON_PIN, HIGH); + + Serial1.begin(115200, SERIAL_8N1, PCIE_RX_PIN, PCIE_TX_PIN); + pinMode(PCIE_PWR_PIN, OUTPUT); + digitalWrite(PCIE_PWR_PIN, 1); + delay(500); + digitalWrite(PCIE_PWR_PIN, 0); + Serial.println("Wait..."); + delay(3000); + + Serial.println("Initializing modem..."); + modem.init(); + + String modemInfo = modem.getModemInfo(); + Serial.print("Modem Info: "); + Serial.println(modemInfo); + + // 2 Automatic , 13 GSM only , 38 LTE only , 51 GSM and LTE only + int res; + do { + res = modem.setNetworkMode(38); + Serial.print("Modem Set LTE: "); + Serial.println(res); + delay(500); + + } while (res != 1); + + Serial1.println("AT+CPSI?"); // Get connection type and band + delay(500); + if (Serial1.available()) { + String r = Serial1.readString(); + Serial.println(r); + } + + Serial.println("\n---End of GPRS TEST---\n"); + + camera_init(); +} + +void loop() { + Serial.print("Waiting for network..."); + if (!modem.waitForNetwork()) { + Serial.println("Modem Fail"); + delay(10000); + return; + } + Serial.println(" success"); + + if (modem.isNetworkConnected()) { + Serial.println("Network connected"); + } + + Serial.print(F("Connecting to ")); + Serial.print(apn); + if (!modem.gprsConnect(apn, gprsUser, gprsPass)) { + Serial.println("GPRS fail"); + delay(10000); + return; + } + + if (modem.isGprsConnected()) { + Serial.println("GPRS connected"); + takeShot(); + } + + delay(10000); // 10sec +} + +void takeShot() { + + camera_fb_t *fb = esp_camera_fb_get(); + if (!fb) { + Serial.println("[ERROR] GRAB Image"); + return; + } + + Serial.println("[SUCCESS] Take a Shot!"); + + Serial.printf("[Photo] Photo Size : %d Bytes\n", fb->len); + + if (!client.connect(server, port)) { + Serial.println("... failed"); + } else { + + unsigned long currentTotalTime = millis(); + client.print(String("POST ") + resource + " HTTP/1.1\r\n"); + client.print(String("Host: ") + server + "\r\n"); + client.print("Content-Length: "); + client.print(fb->len); + client.print("\r\n"); + client.print("Content-Type: image/jpeg\r\n"); + client.println(); + client.flush(); + + uint8_t tmp[CHUNK_SIZE] = {0}; + size_t blen = sizeof(tmp); + size_t i = 0; + size_t len = fb->len; + int sent_size = 0; + + for (i = 0; i < len / blen; ++i) { + memcpy(tmp, fb->buf + (i * blen), blen); + sent_size = client.write(tmp, CHUNK_SIZE); + } + + if (len % blen) { + size_t rest = len % blen; + memcpy(tmp, fb->buf + (len - len % blen), rest); + sent_size = client.write(tmp, rest); + } + Serial.printf("Time taken to upload a single image: %d ms\n", millis() - currentTotalTime); + + // Wait for data to arrive + uint32_t start = millis(); + while (client.connected() && !client.available() && millis() - start < 30000L) { + delay(100); + }; + + // Read data + start = millis(); + char logo[640] = { + '\0', + }; + int read_chars = 0; + while (client.connected() && millis() - start < 10000L) { + while (client.available()) { + logo[read_chars] = client.read(); + logo[read_chars + 1] = '\0'; + read_chars++; + start = millis(); + } + } + Serial.println(logo); + + client.stop(); + } + + esp_camera_fb_return(fb); +} + +void camera_init() { + camera_config_t config; + config.ledc_channel = LEDC_CHANNEL_0; + config.ledc_timer = LEDC_TIMER_0; + config.pin_d0 = CAM_Y2_PIN; + config.pin_d1 = CAM_Y3_PIN; + config.pin_d2 = CAM_Y4_PIN; + config.pin_d3 = CAM_Y5_PIN; + config.pin_d4 = CAM_Y6_PIN; + config.pin_d5 = CAM_Y7_PIN; + config.pin_d6 = CAM_Y8_PIN; + config.pin_d7 = CAM_Y9_PIN; + config.pin_xclk = CAM_XCLK_PIN; + config.pin_pclk = CAM_PCLK_PIN; + config.pin_vsync = CAM_VSYNC_PIN; + config.pin_href = CAM_HREF_PIN; + config.pin_sscb_sda = CAM_SIOD_PIN; + config.pin_sscb_scl = CAM_SIOC_PIN; + config.pin_pwdn = CAM_PWDN_PIN; + config.pin_reset = CAM_RESET_PIN; + config.xclk_freq_hz = 20000000; + config.frame_size = FRAMESIZE_UXGA; + config.pixel_format = PIXFORMAT_JPEG; + config.jpeg_quality = 10; + config.fb_count = 2; + + // camera init + Serial.println("Camera init"); + esp_err_t err = esp_camera_init(&config); + if (err != ESP_OK) { + Serial.printf("Camera init failed with error 0x%x", err); + ESP.restart(); + return; + } +} \ No newline at end of file diff --git a/Cellular/T-SIMCAM/01_T-SIMCAM_ImageUploader/config.h b/Cellular/T-SIMCAM/01_T-SIMCAM_ImageUploader/config.h new file mode 100755 index 0000000..408f9f9 --- /dev/null +++ b/Cellular/T-SIMCAM/01_T-SIMCAM_ImageUploader/config.h @@ -0,0 +1,46 @@ +#ifndef __CONFIG_H__ +#define __CONFIG_H__ + +// PIN +#define SD_MISO_PIN 40 +#define SD_MOSI_PIN 38 +#define SD_SCLK_PIN 39 +#define SD_CS_PIN 47 + +#define PCIE_PWR_PIN 48 +#define PCIE_TX_PIN 45 +#define PCIE_RX_PIN 46 +#define PCIE_LED_PIN 21 + +#define MIC_IIS_WS_PIN 42 +#define MIC_IIS_SCK_PIN 41 +#define MIC_IIS_DATA_PIN 2 + +#define CAM_PWDN_PIN -1 +#define CAM_RESET_PIN 18 +#define CAM_XCLK_PIN 14 + +#define CAM_SIOD_PIN 4 +#define CAM_SIOC_PIN 5 + +#define CAM_Y9_PIN 15 +#define CAM_Y8_PIN 16 +#define CAM_Y7_PIN 17 +#define CAM_Y6_PIN 12 +#define CAM_Y5_PIN 10 +#define CAM_Y4_PIN 8 +#define CAM_Y3_PIN 9 +#define CAM_Y2_PIN 11 + +#define CAM_VSYNC_PIN 6 +#define CAM_HREF_PIN 7 +#define CAM_PCLK_PIN 13 + +#define BUTTON_PIN 0 +#define PWR_ON_PIN 1 + +#define SERIAL_RX_PIN 44 +#define SERIAL_TX_PIN 43 + +#define BAT_VOLT_PIN -1 +#endif \ No newline at end of file