Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Arduino - Сделать снимок - Загрузить на Google Диск

Компоненты и расходные материалы

Arduino Mega 2560
× 1
PHPoC WiFi Shield 2 для Arduino
× 1
Seeed Grove - комплект для последовательной камеры
× 1
Базовый щит Seeed Grove
× 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. Он предоставляет веб-интерфейс пользователя для процесса входа в Google
    PHPoC / <? 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 "";} 

Схема


Производственный процесс

  1. Arduino Spybot
  2. FlickMote
  3. Самодельный телевизор B-Gone
  4. Основные часы
  5. Найди меня
  6. Arduino Power
  7. Tech-TicTacToe
  8. Четвероногий Arduino
  9. Устройства с голосовым управлением Bluetooth с OK Google
  10. Инвестиции Google для стимулирования внедрения устройств безопасности IoT