Proses manufaktur
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Jika Anda seorang pemula, Anda dapat mempelajari Arduino di sini.
Demonstrasi
Cara Kerjanya
1. Masuk ke Akun Google melalui OAuth 2.0 untuk perangkat IoT guna mendapatkan akses_token.
Proses login dijelaskan dalam proyek ini di Hackster.
2. Saat tombol ditekan, Arduino mengambil gambar dari kamera, lalu mengunggah ke Google Drive menggunakan access_token melalui Google Drive API.
API Google Drive untuk mengunggah file dijelaskan dalam dokumen Google.
Cara
Platform Perangkat Keras Lainnya
Saya membuat proyek yang sama untuk platform perangkat keras lain di sini.
Kit Pemula Arduino Terbaik untuk Pemula
Jika Anda mencari kit Arduino, lihat Kit Arduino Terbaik untuk Pemula
Referensi Fungsi
#include#include #include "grove_camera.h"// Ganti GOOGLE_CLIENT_ID dan GOOGLE_CLIENT_SECRET Anda di siniString GOOGLE_CLIENT_ID ="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxapps.com";xxxxxxxxxxxxxxxapps.com. String GOOGLE_CLIENT_SECRET ="xxxxxxxxxxxxxxxxxxxxxxxxxxx";PhpocServer websocket_server(80);String http_resp_hearder(PhpocClient &klien){ String pendengar =""; while(1){ if(client.available()){ String baris =client.readLine(); if(baris =="\r\n") break; pendengar lain +=baris; } if(!client.connected()){ client.stop(); merusak; } } kembali pendengar;}String http_resp_body(PhpocClient &klien){ String body =""; while(1){ if(client.available()){ char c =client.read(); tubuh +=c; } if(!client.connected()){ client.stop(); merusak; } } 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());}batalkan googleDeviceOAuthLogin(){ klien PhpocClient; // Langkah 1:Minta perangkat dan kode pengguna if(client.connectSSL("accounts.google.com", 443)){ Serial.println(F("Connected to server")); String badan =F("klien_id="); badan +=GOOGLE_CLIENT_ID; body +=F("&scope=https://www.googleapis.com/auth/drive.file"); client.println(F("POST /o/oauth2/perangkat/kode HTTP/1.1")); client.println(F("Host:akun.google.com")); client.println(F("Koneksi:tutup")); client.println(F("Terima:*/*")); client.println(F("Jenis Konten:aplikasi/x-www-form-urlencoded")); client.print(F("Panjang Konten:")); client.println(body.length()); klien.println(); klien.print(tubuh); String response_hearder =http_resp_hearder(klien); String response_body =http_resp_body(klien); //Serial.println(respons_hearder); //Serial.println(respon_body); JSONVar body_json =JSON.parse(response_body); if(JSON.typeof(body_json) =="undefined"){ Serial.println("Input parsing gagal!"); kembali; } // Langkah 2:Tangani respons server otorisasi String device_code =""; String kode_pengguna =""; lama kedaluwarsa_in =0; int interval =0; String verifikasi_url =""; bool is_valid =benar; if(body_json.hasOwnProperty("device_code")) device_code =body_json["device_code"]; lain is_valid =salah; if(body_json.hasOwnProperty("user_code")) user_code =body_json["user_code"]; lain is_valid =salah; if(body_json.hasOwnProperty("expires_in")) expired_in =(panjang) body_json["expires_in"]; lain is_valid =salah; if(body_json.hasOwnProperty("interval")) interval =(int) body_json["interval"]; lain is_valid =salah; if(body_json.hasOwnProperty("verification_url")) verification_url =body_json["verification_url"]; lain is_valid =salah; if(is_valid){ // Langkah 3:Tampilkan kode pengguna Serial.print(F("Selanjutnya, kunjungi ")); Serial.print(verification_url); Serial.print(F(" pada desktop atau smartphone Anda dan masukkan kode ini:")); Serial.println(kode_pengguna); pesan string; msg ="{\"penyedia\":\"google\","; msg +="\"tindakan\":\"LOGIN\","; msg +="\"verification_url\":\"" +verification_url + "\","; msg +="\"user_code\":\"" + user_code + "\"}"; websocket_send(pesan); // Langkah 5:Server otorisasi polling int poll_max =expired_in / interval; badan =F("id_klien="); badan +=GOOGLE_CLIENT_ID; tubuh +=F("&klien_rahasia="); badan +=GOOGLE_CLIENT_SECRET; badan +=F("&kode="); tubuh +=kode_perangkat; body +=F("&grant_type=http://oauth.net/grant_type/device/1.0"); for(int poll_count =0; poll_count debounceDelay) { if (membaca !=buttonState) { buttonState =membaca; if (buttonState ==HIGH) { mengembalikan true; } } } lastButtonState =membaca; return false;}pengaturan batal(){ Serial.begin(115200); while(!Serial); Phpoc.begin(PF_LOG_SPI | PF_LOG_NET); websocket_server.beginWebSocket("masuk"); Serial.print("Alamat server WebSocket :"); Serial.println(Phpoc.localIP()); pinMode(2, INPUT); cameraInit(CT_JPEG, PR_160x120, JR_640x480);}void loop(){ PhpocClient client =websocket_server.available(); if (klien) { String ws_str =klien.readLine(); if(ws_str =="google\r\n") { googleDeviceOAuthLogin(); } } if(isButtonPressed(2)) { if(access_token !="" &&access_token_expire_at> millis()) cameraToGoogleDrive(); else Serial.println("access_token tidak valid, silahkan login kembali"); }}
PHPoC / G o o g l eMasuk untuk Arduino
#define PIC_PKT_LEN 512 //panjang data setiap pembacaan, jangan atur ini terlalu besar karena ram terbatas#define CAM_ADDR 0//Jenis Warna#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//Resolusi Pratinjau#define PR_80x60 0x01#define PR_160x120 0x03// Resolusi JPEG#define JR_80x64 0x01#define JR_160x128 0x_CAM_160x120 0x_CAM_03xdefine kamera ); // addressunsigned 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}; while (1) { cameraClearRxBuf(); cameraSendCmd(cmd3, 6); if(Serial.readBytes((char *)resp, 6) !=6) lanjutkan; if(resp[0] ==0xaa &&resp[1] ==(0x0e | camera_address) &&resp[2] ==0x06 &&resp[4] ==0 &&resp[5] ==0) break; }}kamera panjangGetPicture(){ char cmd[] ={ 0xaa, 0x04 | kamera_alamat, 0x01, 0x00, 0x00, 0x00 }; resp char yang tidak ditandatangani[6]; unsigned long picTotalLen =0; // panjang gambar while (1){ cameraClearRxBuf(); cameraSendCmd(cmd, 6); if(Serial.readBytes((char *)resp, 6) !=6) lanjutkan; 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) lanjutkan; if(resp[0] ==0xaa &&resp[1] ==(0x0a | camera_address) &&resp[2] ==0x01){ picTotalLen =(resp[3]) | (resp[4] <<8) | (resp[5] <<16); merusak; } } } camera_packet_num =(picTotalLen) / (PIC_PKT_LEN - 6); camera_last_packet_len =PIC_PKT_LEN; if((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 | kamera_alamat, 0x00, 0x00, 0x00, 0x00 }; Serial.setTimeout(100); if(i > 8) &0xff; kameraClearRxBuf(); cameraSendCmd(cmd, 6); int pkt_len; if(i <(jumlah_paket_kamera - 1)) pkt_len =PIC_PKT_LEN; lain pkt_len =camera_last_packet_len; uint16_t cnt =Serial.readBytes((char *)buf, pkt_len); kembali cnt; } else { cmd[4] =0xf0; cmd[5] =0xf0; cameraSendCmd(cmd, 6); } kembalikan "";}
Proses manufaktur
Komponen dan persediaan Arduino Due dari http://www.arduino.cc × 1 3.2 Modul Sentuh TFT 400*240 SD Dengan Perisai untuk Arduino Jatuh tempo Saya menggunakan yang dari Elechouse × 1 RTC DS3231 Jam waktu nyata dari Ebay × 1 GPS uBlox Neo 6M Modul GPS dari Ebay × 1
Komponen dan persediaan Arduino MKR GSM 1400 × 1 Kabel Micro-USB ke USB (Generik) × 1 Baterai Lipo 3,7V × 1 Kartu SIM mikro × 1 Antena UF.L Seluler × 1 Aplikasi dan layanan online Arduino IDE Google Cloud IoT Core T
Komponen dan persediaan Arduino MKR1000 × 1 Sensor Suhu &Kelembaban DHT11 (4 pin) × 1 Kabel jumper (generik) × 1 Breadboard (generik) × 1 Aplikasi dan layanan online Arduino IDE Google Spreadsheet Tentang proyek ini P
Komponen dan persediaan Arduino UNO × 1 Espressif ESP8266 ESP-01 × 1 Aplikasi dan layanan online Arduino IDE Microsoft Visual Studio 2017 Tentang proyek ini Dalam proyek ini, kita akan Belajar bagaimana membuat koneksi antara layanan inter