diff --git a/ESP32_MQTT/1_ESP32CAM_AWSMQTT/1_ESP32CAM_AWSMQTT.ino b/ESP32_MQTT/1_ESP32CAM_AWSMQTT/1_ESP32CAM_AWSMQTT.ino new file mode 100644 index 0000000..d1f234c --- /dev/null +++ b/ESP32_MQTT/1_ESP32CAM_AWSMQTT/1_ESP32CAM_AWSMQTT.ino @@ -0,0 +1,143 @@ +///////////////////////////////////////////////////////////////// +/* + AWS IoT | ESP32CAM working as a publisher on MQTT + Video Tutorial: https://youtu.be/7_3qbou_keg + Created by Eric N. (ThatProject) +*/ +///////////////////////////////////////////////////////////////// + +#include "secrets.h" +#include +#include +#include "WiFi.h" +#include "esp_camera.h" + +#define PWDN_GPIO_NUM 32 +#define RESET_GPIO_NUM -1 +#define XCLK_GPIO_NUM 0 +#define SIOD_GPIO_NUM 26 +#define SIOC_GPIO_NUM 27 +#define Y9_GPIO_NUM 35 +#define Y8_GPIO_NUM 34 +#define Y7_GPIO_NUM 39 +#define Y6_GPIO_NUM 36 +#define Y5_GPIO_NUM 21 +#define Y4_GPIO_NUM 19 +#define Y3_GPIO_NUM 18 +#define Y2_GPIO_NUM 5 +#define VSYNC_GPIO_NUM 25 +#define HREF_GPIO_NUM 23 +#define PCLK_GPIO_NUM 22 + +#define ESP32CAM_PUBLISH_TOPIC "esp32/cam_0" + +const int bufferSize = 1024 * 23; // 23552 bytes + +WiFiClientSecure net = WiFiClientSecure(); +MQTTClient client = MQTTClient(bufferSize); + +void connectAWS() +{ + WiFi.mode(WIFI_STA); + WiFi.begin(WIFI_SSID, WIFI_PASSWORD); + + Serial.println("\n\n====================="); + Serial.println("Connecting to Wi-Fi"); + Serial.println("=====================\n\n"); + + while (WiFi.status() != WL_CONNECTED){ + delay(500); + Serial.print("."); + } + + // Configure WiFiClientSecure to use the AWS IoT device credentials + net.setCACert(AWS_CERT_CA); + net.setCertificate(AWS_CERT_CRT); + net.setPrivateKey(AWS_CERT_PRIVATE); + + // Connect to the MQTT broker on the AWS endpoint we defined earlier + client.begin(AWS_IOT_ENDPOINT, 8883, net); + client.setCleanSession(true); + + Serial.println("\n\n====================="); + Serial.println("Connecting to AWS IOT"); + Serial.println("=====================\n\n"); + + while (!client.connect(THINGNAME)) { + Serial.print("."); + delay(100); + } + + if(!client.connected()){ + Serial.println("AWS IoT Timeout!"); + ESP.restart(); + return; + } + + Serial.println("\n\n====================="); + Serial.println("AWS IoT Connected!"); + Serial.println("=====================\n\n"); +} + +void cameraInit(){ + camera_config_t config; + config.ledc_channel = LEDC_CHANNEL_0; + config.ledc_timer = LEDC_TIMER_0; + config.pin_d0 = Y2_GPIO_NUM; + config.pin_d1 = Y3_GPIO_NUM; + config.pin_d2 = Y4_GPIO_NUM; + config.pin_d3 = Y5_GPIO_NUM; + config.pin_d4 = Y6_GPIO_NUM; + config.pin_d5 = Y7_GPIO_NUM; + config.pin_d6 = Y8_GPIO_NUM; + config.pin_d7 = Y9_GPIO_NUM; + config.pin_xclk = XCLK_GPIO_NUM; + config.pin_pclk = PCLK_GPIO_NUM; + config.pin_vsync = VSYNC_GPIO_NUM; + config.pin_href = HREF_GPIO_NUM; + config.pin_sscb_sda = SIOD_GPIO_NUM; + config.pin_sscb_scl = SIOC_GPIO_NUM; + config.pin_pwdn = PWDN_GPIO_NUM; + config.pin_reset = RESET_GPIO_NUM; + config.xclk_freq_hz = 20000000; + config.pixel_format = PIXFORMAT_JPEG; + config.frame_size = FRAMESIZE_VGA; // 640x480 + config.jpeg_quality = 10; + config.fb_count = 2; + + // 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; + } +} + +void grabImage(){ + camera_fb_t * fb = esp_camera_fb_get(); + if(fb != NULL && fb->format == PIXFORMAT_JPEG && fb->len < bufferSize){ + Serial.print("Image Length: "); + Serial.print(fb->len); + Serial.print("\t Publish Image: "); + bool result = client.publish(ESP32CAM_PUBLISH_TOPIC, (const char*)fb->buf, fb->len); + Serial.println(result); + + if(!result){ + ESP.restart(); + } + } + esp_camera_fb_return(fb); + delay(1); +} + +void setup() { + Serial.begin(115200); + cameraInit(); + connectAWS(); +} + +void loop() { + client.loop(); + if(client.connected()) grabImage(); +} diff --git a/ESP32_MQTT/1_ESP32CAM_AWSMQTT/secrets.h b/ESP32_MQTT/1_ESP32CAM_AWSMQTT/secrets.h new file mode 100644 index 0000000..20bb441 --- /dev/null +++ b/ESP32_MQTT/1_ESP32CAM_AWSMQTT/secrets.h @@ -0,0 +1,26 @@ +#include + +#define SECRET +#define THINGNAME "MyESP32CAM_0" + +const char WIFI_SSID[] = "ThatProject"; +const char WIFI_PASSWORD[] = "California"; +const char AWS_IOT_ENDPOINT[] = "xxxxxxxxxxxxxx-ats.iot.us-west-1.amazonaws.com"; + +// Amazon Root CA 1 +static const char AWS_CERT_CA[] PROGMEM = R"EOF( +-----BEGIN CERTIFICATE----- +-----END CERTIFICATE----- +)EOF"; + +// Device Certificate +static const char AWS_CERT_CRT[] PROGMEM = R"KEY( +-----BEGIN CERTIFICATE----- +-----END CERTIFICATE----- +)KEY"; + +// Device Private Key +static const char AWS_CERT_PRIVATE[] PROGMEM = R"KEY( +-----BEGIN RSA PRIVATE KEY----- +-----END RSA PRIVATE KEY----- +)KEY"; \ No newline at end of file