Arduino - Сделать снимок - Загрузить на Google Диск
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Об этом проекте
Если вы новичок, вы можете узнать об Arduino здесь.
Демонстрация
Как это работает
1. Войдите в учетную запись Google через OAuth 2.0 для устройств IoT, чтобы получить access_token .
Процесс входа в систему описан в этом проекте на Hackster.
2. Когда кнопка нажата, Arduino получает изображение с камеры, а затем загружает его на Google Диск с помощью access_token через Google Drive API.
API Google Диска для загрузки файла описан в документе Google.
Как сделать
- Создайте проект Google на портале разработчиков Google и получите GOOGLE_CLIENT_ID и GOOGLE_CLIENT_SECRET.
- Заменить GOOGLE_CLIENT_ID и GOOGLE_CLIENT_SECRET в коде Arduino.
- Загрузите файл login.php в PHPoC Shield. См. Инструкцию
- Скомпилируйте и загрузите код Arduino через Arduino IDE.
- См. ip_address щита PHPoC на Serial Monitor.
- Откройте страницу входа на PHPoC Shield:http://ip_address/login.php и войдите в свою учетную запись Google.
- Нажмите кнопку, чтобы сделать снимок.
- Проверьте свой Google Диск через две секунды, вы увидите сделанное изображение на своем Диске.
Другая аппаратная платформа
Я сделал тот же проект для другой аппаратной платформы здесь.
Лучший стартовый комплект Arduino для начинающих
Если вы ищете комплект Arduino, см. «Лучший комплект Arduino для начинающих»
Ссылки на функции
- Serial.begin ()
- Serial.println ()
- delay ()
- миллис ()
- цикл для
- цикл while
- если еще
- цикл ()
- setup ()
- String.toInt ()
- String.substring ()
- String.indexOf ()
- String.remove ()
- String.equals ()
Код
- ArduinoGoogleDrive
- login.php
- grove_camera.h
ArduinoGoogleDrive Arduino
Это основной код Arduino.#include#include #include "grove_camera.h" // Замени свои GOOGLE_CLIENT_ID и GOOGLE_CLIENT_SECRET здесьString GOOGLE_CLIENT_ID ="xxxxxxxxxxxxxxxxxxxx Строка GOOGLE_CLIENT_SECRET ="xxxxxxxxxxxxxxxxxxxxxxxx"; PhpocServer websocket_server (80); Строка http_resp_hearder (PhpocClient &client) {String Hearder =""; в то время как (1) {если (client.available ()) {String line =client.readLine (); if (line =="\ r \ n") разрыв; иначе слышит + =линия; } если (! client.connected ()) {client.stop (); ломать; }} return Hearder;} Строка http_resp_body (PhpocClient &client) {String body =""; в то время как (1) {если (client.available ()) {char c =client.read (); тело + =с; } если (! client.connected ()) {client.stop (); ломать; }} return body;} String access_token =""; String refresh_token =""; unsigned long access_token_expire_at =0; void websocket_send (String msg) {char wbuf [256]; msg.toCharArray (wbuf, msg.length () + 1); websocket_server.write (wbuf, msg.length ());} void googleDeviceOAuthLogin () {клиент PhpocClient; // Шаг 1:запрос кода устройства и пользователя if (client.connectSSL ("accounts.google.com", 443)) {Serial.println (F ("Connected to server")); String body =F ("client_id ="); body + =GOOGLE_CLIENT_ID; body + =F ("&scope =https://www.googleapis.com/auth/drive.file"); client.println (F ("POST / o / oauth2 / device / code HTTP / 1.1")); client.println (F ("Хост:accounts.google.com")); client.println (F ("Соединение:закрыть")); client.println (F ("Принять:* / *")); client.println (F ("Content-Type:application / x-www-form-urlencoded")); client.print (F ("Длина содержимого:")); client.println (body.length ()); client.println (); client.print (тело); Строка response_hearder =http_resp_hearder (клиент); Строка response_body =http_resp_body (клиент); //Serial.println(response_hearder); //Serial.println(response_body); JSONVar body_json =JSON.parse (response_body); if (JSON.typeof (body_json) =="undefined") {Serial.println ("Ошибка анализа ввода!"); возвращение; } // Шаг 2. Обработка ответа сервера авторизации String device_code =""; Строка user_code =""; long expires_in =0; интервал int =0; String verify_url =""; bool is_valid =true; если (body_json.hasOwnProperty ("device_code")) device_code =body_json ["device_code"]; иначе is_valid =false; если (body_json.hasOwnProperty ("user_code")) user_code =body_json ["user_code"]; иначе is_valid =false; если (body_json.hasOwnProperty ("expires_in")) expires_in =(long) body_json ["expires_in"]; иначе is_valid =false; если (body_json.hasOwnProperty ("интервал")) interval =(int) body_json ["интервал"]; иначе is_valid =false; если (body_json.hasOwnProperty ("verify_url")) verify_url =body_json ["verify_url"]; иначе is_valid =false; if (is_valid) {// Шаг 3:Отображение кода пользователя Serial.print (F ("Далее, посещение")); Serial.print (Verification_url); Serial.print (F («на рабочем столе или смартфоне и введите этот код:»)); Serial.println (код_пользователя); String msg; msg ="{\" провайдер \ ":\" google \ ","; msg + ="\" действие \ ":\" ВХОД \ ","; msg + ="\" url_проверки \ ":\" "+ url_проверки +" \ ","; msg + ="\" код_пользователя \ ":\" "+ код_пользователя +" \ "}"; websocket_send (сообщение); // Шаг 5:опрос сервера авторизации int poll_max =expires_in / interval; body =F ("client_id ="); body + =GOOGLE_CLIENT_ID; body + =F ("&client_secret ="); body + =GOOGLE_CLIENT_SECRET; body + =F ("&code ="); body + =device_code; body + =F ("&grant_type =http://oauth.net/grant_type/device/1.0"); for (int poll_count =0; poll_count debounceDelay) {если (чтение! =buttonState) {buttonState =чтение; если (buttonState ==HIGH) {вернуть истину; }}} lastButtonState =чтение; вернуть ложь;} void setup () {Serial.begin (115200); в то время как (! серийный); Phpoc.begin (PF_LOG_SPI | PF_LOG_NET); websocket_server.beginWebSocket («логин»); Serial.print ("Адрес сервера WebSocket:"); Serial.println (Phpoc.localIP ()); pinMode (2, ВХОД); cameraInit (CT_JPEG, PR_160x120, JR_640x480);} void loop () {PhpocClient client =websocket_server.available (); если (клиент) {Строка ws_str =client.readLine (); если (ws_str =="google \ r \ n") {googleDeviceOAuthLogin (); }} if (isButtonPressed (2)) {if (access_token! ="" &&access_token_expire_at> millis ()) cameraToGoogleDrive (); else Serial.println («access_token недействителен, пожалуйста, войдите снова»); }}
login.php PHP
Этот код файла загружается в PHPoC Shield. Он предоставляет веб-интерфейс пользователя для процесса входа в GooglePHPoC / Echo system ("uname -i")?> G o o g l eВход для Arduino
grove_camera.h C / C ++
Библиотека для Grove Camera#define PIC_PKT_LEN 512 // длина данных для каждого чтения, не устанавливайте это слишком большим, потому что RAM ограничена # define CAM_ADDR 0 // Color Type #define CT_GRAYSCALE_2 0x01 #define CT_GRAYSCALE_4 0x02 #define CT_GRAYSCALE_8 0x03 # define CT_COLOR_12 0x05 # define CT_COLOR_16 0x06 # define CT_JPEG 0x07 // Preview Resolution # define PR_80x60 0x01 # define PR_160x120 0x03 // JPEG Resolution # define JR_80x64 0x01 # define JR_160x128 0x03 #define JR_320x2 ); // адрес без подписи int camera_packet_num; unsigned int camera_last_packet_len; void cameraClearRxBuf () {while (Serial.available ()) {Serial.read (); }} void cameraSendCmd (char cmd [], int cmd_len) {for (char i =0; i> 8) &0xff, 0}; а (1) {cameraClearRxBuf (); cameraSendCmd (cmd3, 6); if (Serial.readBytes ((char *) resp, 6)! =6) continue; if (resp [0] ==0xaa &&resp [1] ==(0x0e | camera_address) &&resp [2] ==0x06 &&resp [4] ==0 &&resp [5] ==0) break; }} long cameraGetPicture () {char cmd [] ={0xaa, 0x04 | camera_address, 0x01, 0x00, 0x00, 0x00}; беззнаковый символ resp [6]; беззнаковый длинный picTotalLen =0; // длина изображения while (1) {cameraClearRxBuf (); cameraSendCmd (cmd, 6); if (Serial.readBytes ((char *) resp, 6)! =6) continue; if (resp [0] ==0xaa &&resp [1] ==(0x0e | camera_address) &&resp [2] ==0x04 &&resp [4] ==0 &&resp [5] ==0) {Serial.setTimeout (1000); if (Serial.readBytes ((char *) resp, 6)! =6) continue; if (resp [0] ==0xaa &&resp [1] ==(0x0a | camera_address) &&resp [2] ==0x01) {picTotalLen =(resp [3]) | (соответственно [4] <<8) | (соответственно [5] <<16); ломать; }}} camera_packet_num =(picTotalLen) / (PIC_PKT_LEN - 6); camera_last_packet_len =PIC_PKT_LEN; если ((picTotalLen% (PIC_PKT_LEN-6))! =0) {camera_packet_num + =1; camera_last_packet_len =picTotalLen% (PIC_PKT_LEN - 6) + 6; } return picTotalLen;} long cameraGetPacket (unsigned int i, char * buf) {char cmd [] ={0xaa, 0x0e | camera_address, 0x00, 0x00, 0x00, 0x00}; Serial.setTimeout (100); если (я <номер_пакета_камеры) {cmd [4] =я &0xff; cmd [5] =(я>> 8) &0xff; cameraClearRxBuf (); cameraSendCmd (cmd, 6); int pkt_len; if (i <(camera_packet_num - 1)) pkt_len =PIC_PKT_LEN; иначе pkt_len =camera_last_packet_len; uint16_t cnt =Serial.readBytes ((char *) buf, pkt_len); return cnt; } еще {cmd [4] =0xf0; cmd [5] =0xf0; cameraSendCmd (cmd, 6); } return "";}
Схема
Производственный процесс