Category Archives: 聯發科LinkIt家族

150613 海洋大學微處理機課程 期末展示-使用 LinkIt ONE

今年的海洋大學微處理機課程順利完成了,本文要來看看各位同學的作品。與去年不一樣的是,今年使用 LinkIt ONE (去年是 Arduino UNO),因此上課內容針對物聯網所需之WiFi、藍牙與GPS (GPRS需要SIM卡所以沒有使用) 都設計了不同的專題讓同學可以逐步學習。當然也必須要整合到期末專題中喔。再次感謝 MediaTek Labs 贊助上課所需的 LinkIt ONE 開發板 (看到這句話的老師,您也可以向他們提出教學計畫來申請板子喔!

認識阿吉的師長朋友們都知道,我希望學生能夠具備一定的口頭表達能力,因此每一位同學都一定要開口講話,也要說明在組裡的分工(變成吉祥物就不好了…)。畢竟你得先打造一個夢,或是現實生活中的某個問題。接下來才是為了做到這件事,我需要怎樣的技術以及過程所碰到的困難等等。所以報告時不要拿一堆程式碼出來嚇人啊,嚇不倒我的。

在這些過程中,你一定會有很多想法與錯誤的累積,好好把他們記錄下來吧,這就是別人拿不走,屬於你的養分。總有一天這些隱性的東西會大大幫你一把的。

另一方面,在一組裡面一定有人投入多,有人會找機會摸魚(說不定還會捅你一把)。如何學習人和,這也是之後出社會的真實縮影,試著體會吧。

學無速成,重在踏實

Continue reading

[LA計畫] App Inventor 接收 LinkIt ONE 兩筆可變電阻值,還可做磁力畫板

本文介紹如何使用 App Inventor 擷取 LinkIt ONE 上的兩筆可變電阻資料,作法與 [雙A計畫]Part6:Arduino 傳兩筆資料到 Android 手機 是一樣的,只是 LinkIt ONE 在藍牙設定上有一點點不一樣,因此寫一篇分享一下。

除了可在Android 手機畫面上看到 LinkIt ONE 兩個類比腳位變化之外,還可畫線,類似小時候的磁力畫板(啊,暴露年紀…)

本文感謝 CAVEDU 實習生施力維完成

檔案請點我下載


 

 

 

 

 

 

延伸閱讀

[雙A計畫] 常見問題整理

[雙A計劃] Part0:App Inventor 透過藍牙傳送訊號給 Arduino

[雙A計劃] Part1:App Inventor 經由藍牙控制 Arduino LED 亮滅

[雙A計劃] Part2:App Inventor 經由藍牙控制 Arduino LED 漸明漸暗

[雙A計劃] Part4:App Inventor 藍牙遙控 Arduino 雙輪機器人

[雙A計劃] Part5:Paperduino 藍牙控制 LED 閃爍

[雙A計畫]Part6:Arduino 傳兩筆資料到 Android 手機


 

 

 

程式說明

在此只列出 Clock.Timer 事件,首先送出一個 122 數字,LinkIt ONE接收到之後就會把 A0, A1 值丟給 App Inventor。變數X是 LinkIt ONE 傳來的 A0腳位值,Y則是A1.

由於 Canvas 的大小是 320  x 320,因此我們設定把 A0原本的 0~ 1023 範圍透過 map 指令轉為 0~ 320,對應到 X 軸座標。A1 則是對應到 Y 座標,最後使用 Canvas.DrawLine 指令就可以隨意畫圖囉!

01

對應的片段如下

if(LBTServer.connected()){
      a1 = analogRead(A0);
      a2 = analogRead(A1);
      a1 = map(a1,0,1023,0,320);
      a2 = map(a2,0,1023,0,320);
      Serial.printf("%d\t%d\n",a1,a2);
      if(LBTServer.read() == 122){
        BTwrite = LBTServer.write('j');
        BTwrite = LBTServer.write(a1/256);
        BTwrite = LBTServer.write(a1%256);
        BTwrite = LBTServer.write(a2/256);
        BTwrite = LBTServer.write(a2%256);
      }
      delay(10);
  }
LinkIt ONE 端透過 LBTServer 將 A0, A1 依序送出

 

 


 

 

LinkIt ONE 端完整程式

#include <LBT.h>
#include <LBTServer.h>
#define serverName "BTserverTest"
#define serverWaitTime 5

char BTwrite;
void setup() {
  Serial.begin(115200);
  while (!Serial);
  LBTServer.begin((uint8_t*)serverName);
  Serial.printf("[%s] is waiting for any client...\n",serverName);
  
  while(!LBTServer.accept(serverWaitTime)){
    Serial.println(" ... ");
  }
  Serial.println("===Connected!===");
}
int a1,a2;
void loop() {
  if(LBTServer.connected()){
      a1 = analogRead(A0);
      a2 = analogRead(A1);
      a1 = map(a1,0,1023,0,320);
      a2 = map(a2,0,1023,0,320);
      Serial.printf("%d\t%d\n",a1,a2);
      if(LBTServer.read() == 122){
        BTwrite = LBTServer.write('j');
        BTwrite = LBTServer.write(a1/256);
        BTwrite = LBTServer.write(a1%256);
        BTwrite = LBTServer.write(a2/256);
        BTwrite = LBTServer.write(a2%256);
      }
      delay(10);
  }
  else{
    Serial.println("===Disconnected!===");
    Serial.printf("[%s] is waiting for any client...\n",serverName);
    while(!LBTServer.accept(serverWaitTime)){
      Serial.println(" ... ");
    }
    Serial.println("===Connected!===");
  }
}
LinkIt ONE 送出 A0 , A1 類比腳位給 App Inventor

 

執行畫面

從 Serial Monitor 可以看到 A0, A1 目前的狀態

11713381_783552385096897_1979904894_n

轉動 A0, A1 的可變電阻就可以畫出隨意線條,是不是和磁力畫板很像呢?左側是 A0 數值,右側是 A1

 

11739516_783552328430236_792456203_n 11668094_783552338430235_89140845_n

 

150612 LinkIt INE物聯網_種子教師研習營@高雄實踐大學

今天來去高雄內門走一遭,高雄的實踐大學好大阿~足足比我的母校淡江大學多出一倍的空間,彷彿整個山坡都是他的校地。

這次探訪的是實踐大學資訊科的老師同學們,完習營不只是老師,連學生也一起來聽課,中間還發現沒有寫程式經驗的老師也來學習,這個學校的戰鬥力不容小覷。

研習營的內容,老師們實作將 LinkIt ONE 裝置上網抓取網站資訊,並把位於終端的 LinkIt ONE 資訊上傳到雲端網路。讓我們來看看~~

20150612_16013020150612_120251 20150612_112922 20150612_112928  20150612_160057

LinkIt ONE SDK 1.1.08 更新,也有 MAC版了

LinkIt ONE SDK 1.1.08 更新,也有 MAC版了

主要的更新在於不用再一直切換 Debug port 與 Modem port 了,真的常常忘了切回去導致程式傳不上去或是Serial monitor 沒東西之類的,改掉這個問題實在是太好啦

lll

板子的韌體也需要更新,請用 SDK 中的 firmware updater 來更新

1-16

葉難也搶先分享了他的使用意見,歡迎大家更新看看

LinkIt ONE 被誤認為Alcatel Single RNDIS Interface

如果您的 LinkIt ONE 被誤認為Alcatel Single RNDIS Interface ,該怎麼辦呢?(下圖感謝網友提供)

unnamed

這個問題有蠻多種解法,我自己的話是在安裝好 LinkIt ONE SDK 的最後一步(要求安裝 MediaTek USB driver)時,插入 LinkIt ONE,這時電腦會開始找 driver,請點選[取消從 Windows update 取得驅動程式],這樣Windows 就不會上網去找更新檔,應該就不會把 LinkIt ONE 誤認成其他的網路裝置了。或是先停用這個裝置,再手動指定驅動程式到 <Arduino IDE>/drivers/mtk 這個路徑也可以。

1-14

成功的話,就會在裝置管理員 /  [連接埠(COM 和 LPT)]下看到 MTK USB Debug port(上傳程式用)與MTK USB Modem port(Serail monitor用)

1-15

 

 

150427 hackNTU 台大黑客松 IoT組提案

今年CAVEDU 擔任 hackNTU 台大黑客松 IoT組講師群,使用 LinkIt ONE 來進行各種聯網應用,本週一是第五次上課,該是各位同學說說看想做什麼的時候了。和往常不同,對於同學們要如何提案,這次沒有任何規定,只要能清楚表述你想做什麼就可以了。由此可以看出同學對於 [好] 的定義與認知為何。說真的,各組之間的呈現方式各有千秋。可以看到有些同學是真的好好想過,有些則只是當做期末報告來做。

有沒有愛,差很多

IMG_8938

就常見的 IoT 應用來說,不外乎是氣象站、繼電器控制電器等等應用。如果只做到這樣就太可惜了,需要有個情境(遊戲主人公的設定可是攸關遊戲成敗的啊!)。所以我們真正想看到的是如何應用手邊的技術來解決生活中的某個問題。

例如這一組是想要把除濕機的水拿來澆花,如果能確保水質的話,這個想法還挺不錯的

IMG_8943

每一組在提案的呈現上(尤其是投影片)都有很大的不同,猜得出來這組要做的是什麼嗎?是環島日記,裝在交通工具上就可以自動紀錄路徑、匯出 Google Map 與分享到 社群網站等等(Web端的同學很辛苦啊)。
IMG_8926

這一組則是要做一個硬體的專心系統,設定好要專心多久之後,系統就會斷開網路以及一切可能的干擾因素,讓使用者能好好專心。這算是現代人的悲哀嗎?如果要提早解除專心狀態的話,就要付出一定程度的代價(例如投錢之類)

IMG_8932

這組做的就很吸引人啦,看得出來大家下課後的嗜好是什麼,像阿吉老師就是彈彈琴寫寫詩之類的。這台自動調酒機只要選定要喝什麼酒之後就會把調酒裝好杯給您,還可以自調濃度。重點是,如果您覺的這次的調酒好喝, 系統會把這次的成分比例做成QRCODE,之後只要是同樣的QRCODE,就能讓系統調出完全相同的調酒。拜託一定要做出來啊!!(飲酒過量有礙健康,酒後不開車)

IMG_8944

這組則是大樓的節能系統,有營建系的同學加入,雖然系統示意圖相當簡單,

IMG_8936

上台時,自信與颱風是給台下聽眾的第一印象,不是念投影片而已喔!

IMG_8919

也找來毒舌福利社老闆,讓同學對於製造、生產以及行銷上有一些概念。原型與商品之間的差距可是非常大的呢。期末demo時,會把 MediaTek Labs 的開發團隊主管級都找來,一方面是MTK 也想知道第一線使用者的反應(抖),另一方面也讓同學接受一些震撼教育哩。實際上MediaTek Labs 的開發團隊中幾乎都是台大畢業的啊~

IMG_8928

150324 LinkIt ONE 爬網路字元@海洋大學機械系

每週二晚上在海洋大學機械系的 Arduino 微處理機課程,今年使用 LinkIt ONE 來上課,經過之數週的基礎課程之後,終於可以介紹到上網功能了,呼呼…

LinkIt ONE 只要接好天線就可以了,下圖這支天線就是 Wifi / BT 二合一天線,有點像蟑螂鬚啊(爬爬)

LinkIt ONE 相關文章請按我

2015-03-24 19.57.49

在以下的範例中,您只要填入以下四個資料就好:

WIFI_AP:您的 Wifi 存取點名稱

WIFI_PASSWORD:Wifi 密碼

WIFI_AUTH:加密方式

SITE_URL:要擷取的網頁字元,在此為 www.appinventor.tw

2015-03-24 19.47.12

 

2015-03-24 20.20.10

這是上週的作業,8 x 8 LED 陣列(學生表示接線很累…)

2015-03-24 20.43.28

 

最後來看 CODE:

 

150316 臺大黑客松 IoT 課程 with LinkIt ONE #1

3/16 是2015 台大黑客松的第一天,與30位台大各系所的學生與外校的同學一起進行為期十周的 IoT 物聯網課程. 本期課程的開發板使用 LinkIt ONE, 感謝 MediaTek Labs 熱情支持

第一天的內容就是測通電腦與 LinkIt ONE, 只要 LED 可以亮滅就ok囉. (最簡單的日子也就只有今天啦~)

之後每周的課程內容都會與大家分享, 也請大家多多關注相關消息. 3/29 CAVEDU Day 當天也會有 LinkIt ONE demo, 總之就是歡迎參加啦!

20150316_193427 2015-03-16 19.07.11 2015-03-16 19.17.59 2015-03-16 19.06.40 2015-03-16 20.09.25

 

[0329 C-Day 有什麼?] 系列之一:LinkIt ONE BOX!!!!!

隨著329 C-DAY的來臨,展品也陸陸續續進入驗收階段(?),其中,LinkIt ONE似乎是今年熱門的焦點之一。俗話說的好,再好的板子,遇不到對的殼,就只是一塊板子,如果遇到對的殼呢?就變成「有殼的板子」…。著手設計LinkIt ONE的外殼,總共換了三個版本,最後這一款不僅讓天線可以自由伸展、固定,也增加了盒底固定,另外為了能夠在電腦上固定(額外功能?),在其中的一面推出固定座,讓我們來看看成品吧!!

1 2 3 4 5

後製的部份應該會加文字、噴漆,感覺應該會更不一樣,希望大家喜歡這次的外殼設計,圖檔也同步上傳至Thingiverse網站,請點此前往。

150307 LinkIt ONE 物聯網研習,活動花絮來囉

3/7 週六,有許多位學員來參加我們辦的 LinkIt ONE 物聯網研習,其中有來自MediaTek Labs 的開發團隊,他們很想知道終端使用者對於這片板子的看法,也有工研院與業界的朋友一起參與,很熱鬧喔

如果您是台大的同學,今年的 hackNTU 臺大黑客松四門課程中的 IoT 物聯網課程,就是使用 LinkIt ONE 系統來帶您入門,千萬別錯過啦!

只要您手邊有板子,今天的範例都能做到,請跟著本篇完成第一個範例吧:

[LinkIt One 教學] MediaTek Cloud Sandbox 控制 LED 並檢視狀態 – 可同時用手機與網頁來操作

CAVEDU LinkIt ONE 教學文章請點我

IMG_7531_Fotor

IMG_7530

下午進行到 GPS 路徑追蹤時,先示範如何接線以及如何在 MCS 上檢視 data point

 

5F0A0384

我這張照片看起來像大法師之類的

 

5F0A0382

大家紛紛上樓去看是否順利將 GPS data 上傳到 MCS 了,都有成功喔(不過要稍等一下就是了,GPS 取得也是要時間的)。

5F0A0386

同樣的畫面,在原廠提供的 Android app 中也可以正確檢視,下圖中只看經度緯度,沒有上傳海拔,所以海拔為0喔

2015-03-07 14.45.44

 

 

 

 

 

MediaTek Labs 同仁帶來的氣象站 demo

5F0A0372

 

以下是上課花絮,大家都在愉悅(?)的 coding 與查看 API 之中度過了美好(精實)的一天喔

 

5F0A0376

2015-03-07 14.43.47 2015-03-07 14.43.31

感謝 MediaTek Labs 贊助 – 海洋大學與元智大學有 LinkIt ONE 可以用喔

新學期新氣象,本學期在海洋大學機械系的 Arduino 微處理機課程以及元智大學藝術設計系的互動科技課程,都由 MediaTek Labs 贊助對應班上人數的 LinkIt ONE 開發板。我想這學期的課程一定會擦出很不一樣的火花哩!

我不敢說板子能上網就一定比較厲害,但至少能變的花樣一定比較多。在和同學的討論之中,已經有針對 GPS 結合網路的諸多位置應用想法跑出來了,想到就很興奮。

再者,這樣應該會比上課一直刷程式碼來得有趣。不過別誤會,加入網路之後課程難度只會更高,同學甚至有可能要學第二套程式語言(例如 python 或簡易的 html),怎麼樣讓大家愉悅地成長,是我這學期最大的挑戰。

班上做得不錯的同學,5月底要把作品帶到 Maker Faire 來展出,與大家分享。這列入學期成績的一項好了,哇哈哈

linkit

150307 物聯網 IoT研習營(使用 MediaTek LinkIT One )

讓您親身體驗時下最夯的科技議題「物聯網」(Internet of Things),從架構到基本使用,再到創作運用,讓您充分掌握物聯網的脈動。

本次研習使用 Mediatek (聯發科)的 LinkIt One 開發板,是一片具備 Wifi、藍牙、GPS 與行動網路(需另外有 SIM 卡)的 Arduino 相容板,專為物聯網應用而生!並搭配專屬的 MediaTek Cloud Sandbox 就能從網頁與手機來檢視 LinkIt One 上傳的各種資料,是非常完整的全方位開發環境。歡迎您一同進入物聯網的世界!相關文章請參考以下連結:http://blog.cavedu.com/?s=linkit

報名網頁請點我

主辦單位:CAVEDU 教育團隊、翰尼斯企業有限公司
協辦單位:MediaTek Labs、智能機器人研究所、《Make》國際中文版

時間 : 104年3月7日星期六 9:30~16:30

地點 : 翰尼斯企業有限公司 台北市中正區中華路二段165號1樓

備註: 請自行攜帶筆記型電腦,以便實際操作

收費:3,600 元。名額有限,請儘早報名

付款方式:
1.匯款:
銀行名稱 :華南商業銀行 雙園分行
戶名 :翰尼斯企業有限公司
銀行代號 :008
帳號 :122-10-015315-3
2.來店付款
翰尼斯企業有限公司
台北市中正區中華路二段165號1樓

09:30 CAVEDU 教育團隊簡介

09:50 LinkIt One 硬體介紹、註冊 MCS 帳號、下載開發環境、安裝驅動程式

10:30 基礎電子電路實作(接線,麵包板)
LinkIt One 結合感測器:按鈕、光敏電阻、可變電阻

11:20 Android 裝置使用藍牙與 LinkIt One 互通(傳 integer / char)

12:00 中餐

13:00 MCS 環境介紹:建立 prototype、data channel 與 test device

14:00 LinkIt One 結合 MCS:控制 LED 亮滅(On/Off)與漸明漸暗(PWM),並可在 MCS 檢視類比腳位狀態。

16:00 LinkIt One 其他功能展示(Wifi:取得指定網頁內容、GPS、GPRS,如現場有困難則可用影片)

16:20 結語、賦歸

注意:主辦單位保留修改與解釋活動之所有權利。

服務電話:02-23062900
service@cavedu.com

[LinkIt One 教學] LinkIt One 紀錄 GPS 點於 MediaTek Sandbox (實測於台北 – 武陵農場來回)

為了測試 LinkIt One 的 GPRS 行動網路功能以及電池續航力,決定去一趟武陵農場走走(想玩就說一聲啦!)

早上6:00從台北出發, LinkIt One 插上 3G行動網路預付卡以及 GPS 與 GPRS 天線,希望能順利把GPS座標上傳到 MediaTek Cloud Sandbox 雲端服務。

我們正在與聯發科規劃一系列的 LinkIt One 研習,到時候您也能體驗這項雲端服務喔!

2015-01-23 06.06.08

連 beta 版都算不上的行動版,之後要加裝外殼、燈號/聲音來確認資料是否順利寫入(前一天晚上還在確認啊…)

2015-01-23 06.06.15

來看看,這是從台北走國道五號到宜蘭市的座標軌跡,中間缺一段應該是在雪隧。

2015-01-23 07.12.45

這一段就是走台七甲線到武陵農場,好遠的一段路啊。

2015-01-23 09.02.32

武陵農場內的七家灣溪旁,就是櫻花鉤吻鮭培育中心那邊喔

2015-01-23 13.00.19

 

最後是福利時間,來看看美麗的櫻花與梅花吧!

[LinkIt One 教學] MediaTek Cloud Sandbox 控制 LED 並檢視狀態 – 可同時用手機與網頁來操作

照過來照過來,看看如何使用 MediaTek Cloud Sandbox 雲端服務來控制 LED 並檢視狀態 – 手機與網頁都可以同時控制喔。沒有LinkIt One 開發板的朋友,也可以先到 MCS 註冊一個帳號,我們很快就會辦理 LinkIt One 的物聯網研習,歡迎大家報名喔!

[LinkIt One 教學] 連接 LinkIt ONE 到 MediaTek Cloud Sandbox

先來看影片,配音員阿吉老師

這是系統的樣子,我們直接在 pin 13 插一個超白光 LED,錄影效果比較好。三支天線由上而下分別是 GPRS、Wifi/BT 與 GPS。

IMG_0710

這是本範例的介面,請看最下面的 LED_CONTROL 是控制 LED 亮滅,右邊的 LED 則是檢視 LED 狀態。

螢幕快照 2015-01-21 下午9.19.00

程式碼如下:

//#include <b64.h>
#include <HttpClient.h>
#include <LTask.h>
#include <LWiFi.h>
#include <LWiFiClient.h>
#include <LDateTime.h>
#define WIFI_AP "IT Portable Hotspot"
#define WIFI_PASSWORD "12345678"
#define WIFI_AUTH LWIFI_WPA  // choose from LWIFI_OPEN, LWIFI_WPA, or LWIFI_WEP.
#define per 50
#define per1 3
#define DEVICEID "********" // Input your deviceId
#define DEVICEKEY "***************" // Input your deviceKey
#define SITE_URL "api.mediatek.com"

LWiFiClient c;
unsigned int rtc;
unsigned int lrtc;
unsigned int rtc1;
unsigned int lrtc1;
char port[4]="   ";
char connection_info[21]="                    ";
char ip[21]="              ";             
int portnum;
int val = 0;
String tcpdata = String(DEVICEID) + "," + String(DEVICEKEY) + ",0";
String upload_led;
LWiFiClient c2;
HttpClient http(c2);

void setup()
{
  
  LTask.begin();
  LWiFi.begin();
  Serial.begin(115200);
  while(!Serial) delay(1000); /* comment out this line when Serial is not present, ie. run this demo without connect to PC */

  Serial.println("Connecting to AP");
  while (0 == LWiFi.connect(WIFI_AP, LWiFiLoginInfo(WIFI_AUTH, WIFI_PASSWORD)))
  {
    delay(1000);
  }
  
  Serial.println("calling connection");

  while (!c2.connect(SITE_URL, 80))
  {
    Serial.println("Re-Connecting to WebSite");
    delay(1000);
  }
  delay(100);

  pinMode(13, OUTPUT);
  getconnectInfo();
  connectTCP();
}

void getconnectInfo(){
  //calling RESTful API to get TCP socket connection
  c2.print("GET /mcs/v2/devices/");
  c2.print(DEVICEID);
  c2.println("/connections.csv HTTP/1.1");
  c2.print("Host: ");
  c2.println(SITE_URL);
  c2.print("deviceKey: ");
  c2.println(DEVICEKEY);
  c2.println("Connection: close");
  c2.println();
  
  delay(500);

  int errorcount = 0;
  while (!c2.available())
  {
    Serial.println("waiting HTTP response: ");
    Serial.println(errorcount);
    errorcount += 1;
    if (errorcount > 10) {
      c2.stop();
      return;
    }
    delay(100);
  }
  int err = http.skipResponseHeaders();

  int bodyLen = http.contentLength();
  Serial.print("Content length is: ");
  Serial.println(bodyLen);
  Serial.println();
  char c;
  int ipcount = 0;
  int count = 0;
  int separater = 0;
  while (c2)
  {
    int v = c2.read();
    if (v != -1)
    {
      c = v;
      Serial.print(c);
      connection_info[ipcount]=c;
      if(c==',')
      separater=ipcount;
      ipcount++;    
    }
    else
    {
      Serial.println("no more content, disconnect");
      c2.stop();

    }
    
  }
  Serial.print("The connection info: ");
  Serial.println(connection_info);
  int i;
  for(i=0;i<separater;i++)
  {  ip[i]=connection_info[i];
  }
  int j=0;
  separater++;
  for(i=separater;i<21 && j<5;i++)
  {  port[j]=connection_info[i];
     j++;
  }
  Serial.println("The TCP Socket connection instructions:");
  Serial.print("IP: ");
  Serial.println(ip);
  Serial.print("Port: ");
  Serial.println(port);
  portnum = atoi (port);
  Serial.println(portnum);

} //getconnectInfo

void uploadstatus(){
  //calling RESTful API to upload datapoint to MCS to report LED status
  Serial.println("calling connection");
  LWiFiClient c2;  

  while (!c2.connect(SITE_URL, 80))
  {
    Serial.println("Re-Connecting to WebSite");
    delay(1000);
  }
  delay(100);
  if(digitalRead(13)==1)
  upload_led = "LED,,on";
  else
  upload_led = "LED,,off";
  int thislength = upload_led.length();
  HttpClient http(c2);
  c2.print("POST /mcs/v2/devices/");
  c2.print(DEVICEID);
  c2.println("/datapoints.csv HTTP/1.1");
  c2.print("Host: ");
  c2.println(SITE_URL);
  c2.print("deviceKey: ");
  c2.println(DEVICEKEY);
  c2.print("Content-Length: ");
  c2.println(thislength);
  c2.println("Content-Type: text/csv");
  c2.println("Connection: close");
  c2.println();
  c2.println(upload_led);
  
  delay(500);

  int errorcount = 0;
  while (!c2.available())
  {
    Serial.print("waiting HTTP response: ");
    Serial.println(errorcount);
    errorcount += 1;
    if (errorcount > 10) {
      c2.stop();
      return;
    }
    delay(100);
  }
  int err = http.skipResponseHeaders();

  int bodyLen = http.contentLength();
  Serial.print("Content length is: ");
  Serial.println(bodyLen);
  Serial.println();
  while (c2)
  {
    int v = c2.read();
    if (v != -1)
    {
      Serial.print(char(v));
    }
    else
    {
      Serial.println("no more content, disconnect");
      c2.stop();

    }
    
  }
}



void connectTCP(){
  //establish TCP connection with TCP Server with designate IP and Port
  c.stop();
  Serial.println("Connecting to TCP");
  Serial.println(ip);
  Serial.println(portnum);
  while (0 == c.connect(ip, portnum))
  {
    Serial.println("Re-Connecting to TCP");    
    delay(1000);
  }  
  Serial.println("send TCP connect");
  c.println(tcpdata);
  c.println();
  Serial.println("waiting TCP response:");
} //connectTCP

void heartBeat(){
  Serial.println("send TCP heartBeat");
  c.println(tcpdata);
  c.println();
    
} //heartBeat

void loop()
{
  //Check for TCP socket command from MCS Server 
  String tcpcmd="";
  while (c.available())
   {
      int v = c.read();
      if (v != -1)
      {
        Serial.print((char)v);
        tcpcmd += (char)v;
        if (tcpcmd.substring(52).equals("1")){
          digitalWrite(13, HIGH);
          Serial.print("Switch LED ON ");
          tcpcmd="";
        }else if(tcpcmd.substring(52).equals("0")){  
          digitalWrite(13, LOW);
          Serial.print("Switch LED OFF");
          tcpcmd="";
        }
      }
   }

  LDateTime.getRtc(&rtc);
  if ((rtc - lrtc) >= per) {
    heartBeat();
    lrtc = rtc;
  }
  //Check for report datapoint status interval
  LDateTime.getRtc(&rtc1);
  if ((rtc1 - lrtc1) >= per1) {
    uploadstatus();
    lrtc1 = rtc1;
  }
  
}
LinkItOne_LED_MCS