取得訊息範例
2407.565181,N,12041.025767,E,170526,231638.0,44.4,11.6,266.2
#define iModemRx 26
#define iModemTx 27
#define iCharArrayMax 1024
#define iLed 12
#include <ctype.h>
HardwareSerial SerialAT(1);
char caATCmd[]="AT+CGPSINFO";
char caATKeyword[]="+CGPSINFO:";
char caPhp[]="cgpsinfo.php";
int iLedVal=0;
void qa(const char caQuestion[], char caAnswer[])
{
caAnswer[0]='\0';
while(SerialAT.available()) { SerialAT.read(); } // clear leftover data
SerialAT.write(caQuestion);
SerialAT.write("\r\n");
delay(50);
int iLen=0;
unsigned long ulLast=millis();
int iMaxMilliSecond=10000;
// maybe multi lines
while((millis()-ulLast)<iMaxMilliSecond)
{
while(SerialAT.available())
{
char c1=SerialAT.read();
ulLast=millis();
if(iLen<(iCharArrayMax-1))
{
caAnswer[iLen]=c1;
iLen++;
caAnswer[iLen]='\0';
}
}
if(strstr(caAnswer, "\r\nOK\r\n") || strstr(caAnswer, "\r\nERROR\r\n")) { iMaxMilliSecond=300; }
delay(1);
}
}
bool getBooQA(const char caQuestion[], const char caKeyword[])
{
static char caAnswerBuffer[iCharArrayMax];
qa(caQuestion, caAnswerBuffer);
if(strstr(caAnswerBuffer, caKeyword)!=NULL) { return true; }
return false;
}
void setup()
{
static char caAnswer[iCharArrayMax];
pinMode(iLed, OUTPUT);
digitalWrite(iLed, 1);
Serial.begin(115200); // esp32
SerialAT.begin(115200, SERIAL_8N1, iModemRx, iModemTx); // sim7600g-h
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
delay(3000);
while(SerialAT.available()) SerialAT.read();
while(getBooQA("AT", "OK")==false) { delay(1000); } // wait until AT is OK
// enable GPS via AT+CGPS=1
qa("AT+CGPS=0", caAnswer);
delay(3000);
qa("AT+CGPS=1", caAnswer);
// network registration
int iRetry=0;
while(getBooQA("AT+CGDCONT=1,\"IP\",\"internet\"", "\r\nOK\r\n")==false)
{
delay(1000);
iRetry++;
if(iRetry>10) { break; }
}
if(iRetry>10)
{
digitalWrite(4, LOW);
delay(500);
digitalWrite(4, HIGH);
delay(8000);
ESP.restart();
}
digitalWrite(iLed, 0);
}
bool getBooExtractGPSDataOk(char caInput[], char caOutput[], int iOutputMax, const char caKeyword[])
{
int iIdxInput=0;
int iIdxOutput=0;
bool booFound=false;
caOutput[0]='\0';
while(true)
{
if(caInput[iIdxInput]=='\0') { break; }
if(strncmp(&caInput[iIdxInput], caKeyword, strlen(caKeyword))==0)
{
booFound=true;
iIdxInput+=strlen(caKeyword);
while(caInput[iIdxInput]==' ') { iIdxInput++; } // remove spaces
break;
}
iIdxInput++;
if(iIdxInput>=(iCharArrayMax-1)) { return false; }
}
if(booFound==false) { return false; }
while(true)
{
if(caInput[iIdxInput]=='\0') { break; }
if(caInput[iIdxInput]=='\r' || caInput[iIdxInput]=='\n') { break; }
if(iIdxOutput<(iOutputMax-1))
{
caOutput[iIdxOutput]=caInput[iIdxInput];
iIdxOutput++;
}
else
{
break;
}
iIdxInput++;
if(iIdxInput>=iCharArrayMax) { break; }
}
caOutput[iIdxOutput]='\0';
if(iIdxOutput<=28) { return false; }
if(caOutput[11]!=',' || caOutput[13]!=',' || caOutput[26]!=',' || caOutput[28]!=',') { return false; }
return true;
}
bool getBooSafeChar(char c1)
{
if ((c1 >= 'a' && c1 <= 'z') ||
(c1 >= 'A' && c1 <= 'Z') ||
(c1 >= '0' && c1 <= '9'))
{
return true;
}
if (c1 == '-' ||
c1 == '_' ||
c1 == '.' ||
c1 == '~')
{
return true;
}
return false;
}
void encodeURIComponent(const char caInput[], char caOutput[], int iOutputMax)
{
static const char caHex[] = "0123456789ABCDEF";
int iIdxInput=0;
int iIdxOutput=0;
while(caInput[iIdxInput]!='\0' && iIdxOutput<(iOutputMax-1))
{
char c1=caInput[iIdxInput];
if(c1=='\r' || c1=='\n')
{
}
else if(getBooSafeChar(c1)==true)
{
caOutput[iIdxOutput]=c1;
iIdxOutput++;
}
else
{
if((iIdxOutput+3)>=iOutputMax) { break; }
caOutput[iIdxOutput+0] = '%';
caOutput[iIdxOutput+1] = caHex[(c1 >> 4) & 0xF];
caOutput[iIdxOutput+2] = caHex[c1 & 0xF];
iIdxOutput+=3;
}
iIdxInput++;
if(iIdxInput>=iCharArrayMax) { break; }
}
caOutput[iIdxOutput]='\0';
}
void sendGpsData(const char caPhp[], const char caGpsData[])
{
static char caEncodedGpsData[iCharArrayMax];
static char caCommand[1024];
caEncodedGpsData[0]='\0';
caCommand[0]='\0';
while(true)
{
if(getBooQA("AT+CPIN?", "+CPIN: READY")==false) { break; }
if(getBooQA("AT+CGATT=1", "\r\nOK\r\n")==false) { break; }
if(getBooQA("AT+CGATT?", "+CGATT: 1")==false) { break; }
if(getBooQA("AT+HTTPINIT", "\r\nOK\r\n")==false) { break; }
// parameters
encodeURIComponent(caGpsData, caEncodedGpsData, iCharArrayMax);
snprintf(
caCommand,
sizeof(caCommand),
"AT+HTTPPARA=\"URL\",\"http://liujiaje.com/resources/20260513_lilygo_t_sim7600g_h/%s?id=%s&data=%s\"",
caPhp, "lilygo1", caEncodedGpsData);
if(getBooQA(caCommand, "\r\nOK\r\n")==false) { break; }
if(getBooQA("AT+HTTPACTION=0", "+HTTPACTION:")==true)
{
delay(50);
getBooQA("AT+HTTPREAD=0,200", "+HTTPREAD:"); // read 200 bytes
delay(50);
}
int iRetry=0;
while(getBooQA("AT+HTTPTERM", "\r\nOK\r\n")==false)
{
delay(1000);
iRetry++;
if(iRetry>30)
{
// modem might be stuck
digitalWrite(4, LOW);
delay(500);
digitalWrite(4, HIGH);
delay(8000);
break;
}
}
break;
}
}
void loop()
{
char caAnswer[iCharArrayMax];
char caGpsData[iCharArrayMax];
iLedVal=(iLedVal+1) % 2;
digitalWrite(iLed, iLedVal);
while(true)
{
if(getBooQA("AT+CGPS?", "+CGPS: 1,1")==false) { break; }
delay(10);
qa(caATCmd, caAnswer);
caAnswer[iCharArrayMax-1]='\0';
if(getBooExtractGPSDataOk(caAnswer, caGpsData, sizeof(caGpsData), caATKeyword)==false) { break; }
if(strlen(caGpsData)<=14) { break; }
sendGpsData(caPhp, caGpsData);
break;
}
delay(1000);
/*
while (Serial.available()) { SerialAT.write(Serial.read()); }
while (SerialAT.available()) { Serial.write(SerialAT.read()); }
*/
}
#define iModemRx 26
#define iModemTx 27
#define iCharArrayMax 1024
#include <ctype.h>
HardwareSerial SerialAT(1);
char caATCmd[]="AT+CGPSINFO";
char caATKeyword[]="+CGPSINFO:";
char caPhp[]="cgpsinfo.php";
/*
char caATCmd[]="AT+CGNSINF";
char caATKeyword[]="+CGNSINF:";
char caPhp[]="cgnsinf.php";
*/
void qa(const char caQuestion[], char caAnswer[])
{
while(SerialAT.available()) { SerialAT.read(); } // clear leftover data
SerialAT.write(caQuestion);
SerialAT.write("\r\n");
delay(50);
int iLen=0;
unsigned long ulLast=millis();
// maybe multi lines
while((millis()-ulLast)<10000)
{
while(SerialAT.available())
{
char c1=SerialAT.read();
ulLast=millis();
if(iLen<(iCharArrayMax-1))
{
caAnswer[iLen]=c1;
iLen++;
caAnswer[iLen]='\0';
}
}
if(strstr(caAnswer, "OK") || strstr(caAnswer, "ERROR")) { break; }
}
delay(50);
}
bool getBooQA(const char caQuestion[], const char caKeyword[])
{
char caAnswerBuffer[iCharArrayMax];
qa(caQuestion, caAnswerBuffer);
if(strstr(caAnswerBuffer, caKeyword)!=NULL) { return true; }
return false;
}
void setup()
{
char caAnswer[iCharArrayMax];
Serial.begin(115200); // esp32
SerialAT.begin(115200, SERIAL_8N1, iModemRx, iModemTx); // sim7600g-h
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
delay(3000);
while(getBooQA("AT", "OK")==false) { delay(1000); } // wait until AT is OK
// enable GPS via AT+CGPS=1
qa("AT+CGPS=0", caAnswer);
delay(3000);
qa("AT+CGPS=1", caAnswer);
while(getBooQA("AT+CGDCONT=1,\"IP\",\"internet\"", "OK")==false) { delay(1000); } // network registration
}
bool getBooExtractGPSDataOk(char caInput[], char caOutput[], int iOutputMax, const char caKeyword[])
{
int iIdxInput=0;
int iIdxOutput=0;
bool booFound=false;
while(true)
{
if(caInput[iIdxInput]=='\0') { break; }
if(strncmp(&caInput[iIdxInput], caKeyword, strlen(caKeyword))==0)
{
booFound=true;
iIdxInput+=strlen(caKeyword);
while(caInput[iIdxInput]==' ') { iIdxInput++; } // remove spaces
break;
}
iIdxInput++;
}
if(booFound==false) { return false; }
while(true)
{
if(caInput[iIdxInput]=='\0') { break; }
if(caInput[iIdxInput]=='\r' || caInput[iIdxInput]=='\n') { break; }
if(iIdxOutput<(iOutputMax-1))
{
caOutput[iIdxOutput]=caInput[iIdxInput];
iIdxOutput++;
}
iIdxInput++;
}
caOutput[iIdxOutput]='\0';
if(iIdxOutput<=28) { return false; }
if(caOutput[11]!=',' || caOutput[13]!=',' || caOutput[26]!=',' || caOutput[28]!=',') { return false; }
return true;
//return (iIdxOutput>0);
}
bool getBooSafeChar(char c1)
{
if ((c1 >= 'a' && c1 <= 'z') ||
(c1 >= 'A' && c1 <= 'Z') ||
(c1 >= '0' && c1 <= '9'))
{
return true;
}
if (c1 == '-' ||
c1 == '_' ||
c1 == '.' ||
c1 == '~')
{
return true;
}
return false;
}
void encodeURIComponent(const char caInput[], char caOutput[], int iOutputMax)
{
int iIdxInput=0;
int iIdxOutput=0;
while(caInput[iIdxInput]!='\0' && iIdxOutput<(iOutputMax-1))
{
char c1=caInput[iIdxInput];
if(c1=='\r' || c1=='\n')
{
}
else if(getBooSafeChar(c1)==true)
{
caOutput[iIdxOutput]=c1;
iIdxOutput++;
}
else
{
if((iIdxOutput+3)>=iOutputMax) { break; }
sprintf(&caOutput[iIdxOutput], "%%%02X", (unsigned char)c1);
iIdxOutput+=3;
}
iIdxInput++;
}
caOutput[iIdxOutput]='\0';
}
void sendGpsData(const char caPhp[], const char caGpsData[])
{
char caEncodedGpsData[iCharArrayMax];
while(true)
{
if(getBooQA("AT+CPIN?", "+CPIN: READY")==false) { break; }
if(getBooQA("AT+CGATT=1", "OK")==false) { break; }
if(getBooQA("AT+CGATT?", "+CGATT: 1")==false) { break; }
if(getBooQA("AT+HTTPINIT", "OK")==false) { break; }
// parameters
encodeURIComponent(caGpsData, caEncodedGpsData, iCharArrayMax);
char caCommand[1024];
snprintf(
caCommand,
sizeof(caCommand),
"AT+HTTPPARA=\"URL\",\"http://liujiaje.com/resources/20260513_lilygo_t_sim7600g_h/%s?id=%s&data=%s\"",
caPhp, "lilygo1", caEncodedGpsData);
if(getBooQA(caCommand, "OK")==false) { break; }
if(getBooQA("AT+HTTPACTION=0", "OK")==true)
{
delay(50);
getBooQA("AT+HTTPREAD=0,200", "."); // read 200 bytes
delay(50);
}
while(getBooQA("AT+HTTPTERM", "OK")==false) { delay(1000); }
// delay(500);
break;
}
}
void loop()
{
char caAnswer[iCharArrayMax];
char caGpsData[iCharArrayMax];
while(true)
{
if(getBooQA("AT+CGPS?", "+CGPS: 1,1")==false) { break; }
delay(10);
qa(caATCmd, caAnswer);
if(getBooExtractGPSDataOk(caAnswer, caGpsData, sizeof(caGpsData), caATKeyword)==false) { break; }
if(strlen(caGpsData)<=14) { break; }
sendGpsData(caPhp, caGpsData);
// delay(4000);
break;
}
delay(1000);
/*
while (Serial.available()) { SerialAT.write(Serial.read()); }
while (SerialAT.available()) { Serial.write(SerialAT.read()); }
*/
}
#define MODEM_RX 26
#define MODEM_TX 27
HardwareSerial SerialAT(1);
const int iBufferMax=1024;
char caBuffer[iBufferMax];
const int iEncodedDataMax=1024;
char caEncodedData[iEncodedDataMax];
char caData[iEncodedDataMax];
char caGps[iEncodedDataMax];
void setup()
{
Serial.begin(115200);
SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
delay(3000);
Serial.println("");
Serial.println("wait...");
while(getBooQA("AT", "OK")==false) { delay(1000); }
while(true)
{
if(getBooQA("AT", "OK")==false) { break; }
Serial.println("AT OK");
if(getBooQA("AT+CGDCONT=1,\"IP\",\"internet\"", "OK")==false) { break; }
Serial.println("CGDCONT OK");
break;
}
qa("AT+CGPS=0", caBuffer);
delay(3000);
qa("AT+CGPS=1", caBuffer);
Serial.println("setup finishd");
}
void sendData(const char *cData)
{
while(true)
{
if(getBooQA("AT+CPIN?", "+CPIN: READY")==false) { break; }
Serial.println("CPIN OK");
if(getBooQA("AT+CGATT=1", "OK")==false) { break; }
Serial.println("CGATT SET");
if(getBooQA("AT+CGATT?", "+CGATT: 1")==false) { break; }
Serial.println("CGATT REALLY OK");
if(getBooQA("AT+HTTPINIT", "OK")==false) { break; }
Serial.println("HTTPINIT OK");
urlEncode(cData, caEncodedData, iEncodedDataMax);
Serial.println(caEncodedData);
char caCmd[1024];
snprintf(
caCmd,
sizeof(caCmd),
"AT+HTTPPARA=\"URL\",\"http://liujiaje.com/resources/20260513/index.php"
"?data=%s\"",
caEncodedData);
if(getBooQA(caCmd, "OK")==false) { break; }
Serial.println("HTTPPARA OK");
if(getBooQA("AT+HTTPACTION=0", "OK")==false) { break; }
Serial.println("HTTPACTION OK");
getBooQA("AT+HTTPREAD=0,200", ".");
Serial.println("read data...");
delay(1000);
if(getBooQA("AT+HTTPTERM", "OK")==false) { break; }
Serial.println("HTTPTERM OK");
break;
}
}
bool getBooQA(const char *cQ, const char *cKW)
{
qa(cQ, caBuffer);
if(!strstr(caBuffer, cKW)) { return false; }
return true;
}
void qa(const char *cQ, char cA[])
{
while(SerialAT.available()) { SerialAT.read(); }
SerialAT.write(cQ);
SerialAT.write("\r\n");
delay(50);
int iLen=0;
unsigned long ulLast=millis();
while((millis()-ulLast)<3000)
{
while(SerialAT.available())
{
char c1=SerialAT.read();
ulLast=millis();
if(iLen<(iBufferMax-1))
{
cA[iLen]=c1;
iLen++;
cA[iLen]='\0';
}
}
if(strstr(cA, "OK") || strstr(cA, "ERROR")) { break; }
}
delay(50);
}
bool getBooSafeChar(char c)
{
if ((c >= 'a' && c <= 'z') ||
(c >= 'A' && c <= 'Z') ||
(c >= '0' && c <= '9'))
{
return true;
}
if (c == '-' || c == '_' || c == '.' || c == '~')
{
return true;
}
return false;
}
void urlEncode(const char *cIn, char *cOut, int iOutMax)
{
int iIn=0;
int iOut=0;
while(cIn[iIn]!='\0' && iOut<(iOutMax-1))
{
char c = cIn[iIn];
if(c=='\r' || c=='\n')
{
}
else if(getBooSafeChar(c))
{
cOut[iOut++]=c;
}
else
{
if(iOut+3>=iOutMax) { break; }
sprintf(&cOut[iOut], "%%%02X", (unsigned char)c);
iOut+=3;
}
iIn++;
}
cOut[iOut]='\0';
}
bool extractGPS(char *in, char *out, int outMax)
{
const char *key = "+CGPSINFO:";
int i = 0;
int o = 0;
bool found = false;
while(in[i] != '\0')
{
// 1. 找到 +CGPSINFO:
if(!found)
{
if(strncmp(&in[i], key, strlen(key)) == 0)
{
found = true;
i += strlen(key);
// 可選:跳過空白
while(in[i] == ' ') i++;
continue;
}
}
else
{
// 2. 遇到 CR 或 LF 結束
if(in[i] == '\r' || in[i] == '\n')
{
break;
}
// 3. 存入 output
if(o < (outMax - 1))
{
out[o++] = in[i];
}
}
i++;
}
out[o] = '\0';
return (o > 0);
}
void loop()
{
while (Serial.available())
{
qa(Serial.readString().c_str(), caBuffer);
Serial.println(caBuffer);
}
if(getBooQA("AT+CGPS?", "+CGPS: 1,1")==true)
{
delay(10);
qa("AT+CGPSINFO", caBuffer);
if(extractGPS(caBuffer, caGps, sizeof(caGps)))
{
memcpy(caData, caGps, iEncodedDataMax);
if(strlen(caGps)>14)
{
Serial.println("sendData");
Serial.println(caData);
sendData(caData);
delay(1000);
}
}
}
delay(1000);
/*
while (Serial.available()) { SerialAT.write(Serial.read()); }
while (SerialAT.available()) { Serial.write(SerialAT.read()); }
*/
}
【mcu 微控制器】
mcu 比較
esp32 lolin d32 雙核記憶體大,可用 thonny [micropython] 開發
esp32 c3 supermini 單核記憶體小,使用 arduino [c++] 開發
esp32 c3 supermini 的燒錄問題
按住 boot 不放
再按 reset
放開 reset
再放開 boot
這時候可以 erase flash 、 upload programs
esp32 c3 supermini 的 wifi 問題
最後用 WiFi.setTxPower(WIFI_POWER_8_5dBm); 解決
【電腦與微控制器之間的溝通-序列埠】
USB:Universal Serial Bus
UART:Universal Asynchronous Receiver/Transmitter 通用非同步收發傳輸器
(e.q.RS232[COM1, COM2, ......], RS449, ......)
通訊埠
Windows 用 COM (COMunication)
MacOS X, Linux 用 TTY (teletypewriter)
傳輸速率(Baud rate)
e.q.9600bps, 115200bps
CDC:Communications Device Class 通訊裝置
ACM:Abstract Control Model 抽象控制模型
JTAG:Joint Test Action Group 聯合測試工作群組
USB TO UART:USB→CH340/CP2102晶片→UART TX/RX→MCU
Win7─COM1, ......
Win11─COM1, ......
Ras~PiOS(rpi4,rpi5)─/dev/ttyUSB0, ......
USB CDC ACM:USB→MCU內建的USB Peripheral(虛擬UART,但已非bit傳輸,而是packet傳輸)
Win7─不支援
Win11─COM1, ......
Ras~PiOS(rpi4,rpi5)─/dev/ttyACM0, ......
USB JTAG:透過USB直接對MCU偵錯
e.q.breakpoint, single step, watch variable
※rx, tx 衝突問題
內建序列埠 是 PC 跟 MCU 溝通的管道,thonny與arduino都需要。
當 gps 模組也要用到 rx, tx 時,就得閃過內建的序列埠。
【gps 模組(neo-6m, neo-7m, neo-m8n, ......)】
neo-6m 抓到衛星時,會閃藍燈。
neo-m8n 電源導通會有固定紅燈,抓到衛星時,另一個紅燈會閃爍。
添購時,一定要選有附天線的版本。(通常是陶瓷天線)
陶瓷天線要遠離雜訊 (mcu, 行動電源, ......)
【整合開發環境 ide】
thonny https://thonny.org/
使用 micropython 語言
工具小而美。寫入的 *.py 檔案可以讀取出來。
win7/win11:到官網下載安裝程式
Ras~PiOS(rpi4,rpi5):sudo apt install thonny
需要先將 micropython 韌體燒錄到 mcu 中。
https://micropython.org/
要選對應的 mcu 型號
esp32 lolin d32 -- 韌體可用
esp32 c3 supermini -- 韌體可下載,可燒錄,但無法正常使用。
arduino https://www.arduino.cc/ (Products/Arduino IDE)
使用 c++ 語言
工具大很多,但功能較強。
win7:下載舊版來使用 (e.q.arduino 1.8.19)
win11:下載最新版本並安裝 (e.q.arduino-ide_2.3.8_Windows_64bit.exe)
Ras~PiOS(rpi4,rpi5):sudo apr install arduino
Arduino IDE
Board
(需要用 Boards Manager 下載安裝 Espressif Systems 的 esp32 相關資訊)
esp32 lolin d32 要選擇 LOLIN D32
esp32 c3 supermini 要選擇 ESP32C3 Dev Module
Port
選擇 COMx 或 ttyUSBx/ttyACMx
【硬體配置】
底板選擇
1.麵包板+杜邦線
2.麵包板+短導線
3.萬用板(洞洞板)+銅線 (電腦纖維萬用板-用這個)(電木PC板-錫黏不住)
4.PCB(印刷電路板)(EASYEDA+JLCPCB)
外殼挑選
可到大創、無印良品挑選適合的外殼
銲接
電烙鐵 (e.q.日製100W, 臺製40W)
烙鐵頭 (筆型,刀型)(跟瓦數對應,不能亂買)
烙鐵架
錫筆 (含銀錫筆、錫筆)
鍍錫銅線
剪刀、小刀
鑷子
吸錫線
燈光架+手機架 (老花小幫手)
麵包板
排針 (一短一長,兩邊等長)
固定用的硬紙盒
挖洞器
螺絲、螺帽
三用電表 (測量有無導通、有無虛銲)
【購買管道-mcu,gps,pcb,其他零件】
shopee 蝦皮 (mcu、gps模組)
taobao 淘寶 (mcu、gps模組)
tlcpcb 嘉立創 (pcb板)
easyway (若是境外產品,需要授權,可能要付稅金)
今華電子 www.jin-hua.com.tw (螺絲、螺帽、洞洞板、電烙鐵、松香、......)
【印刷電路板 PCB】
先到 EASYEDA 去畫圖 (https://www.easyeda.com/),
之後將圖送到 嘉立創科技 JLCPCB,就可以開始生產。(最低製作量五片)
余光正先生分享的影片非常有用,可以參考。
https://www.youtube.com/watch?v=PpreFVlSHhQ
使用EasyEDA Layout電路板(最簡易教學)
第一次嘗試,從畫圖送出到收件,大約是八天,很興奮!
商品總計: $2.00 USD
運 費: $2.88 USD
訂單總額: $4.88 USD
底下是自己第一次的送件記錄。
生產進度
預計完成時間:2026-05-06 21:57
2026-04-30 22:50:03 MI
2026-05-01 01:36:30 Drilling
2026-05-01 03:10:03 Copper Deposition
2026-05-01 04:01:03 Image the outer layers
2026-05-01 06:26:41 Pattern Plating
2026-05-01 06:47:15 Automatic Optical Inspection(AOI)
2026-05-01 17:01:31 Solder Mask
2026-05-01 20:29:14 Silkscreen
2026-05-01 21:13:01 Hot Air Solder Leveling(HASL)
2026-05-01 21:45:03 Automatic Visual Inspection
2026-05-02 01:05:37 Electrical Test
2026-05-02 04:30:40 Profiling,V-cut scoring
2026-05-02 05:37:31 Final inspection
2026-05-03 14:12:44 From workshop to warehouse
貨運追蹤
2026-05-03 14:12:44 Packaged,waiting for pick up by the carrier,Tracking #: SF02287........
2026-05-03 16:47:37 The shipment has been collected by SF Express
2026-05-03 17:46:06 Export or import needed information still waiting to be provided or checked,Please wait patiently.
2026-05-04 10:59:55 Shipment loaded at 【Zhuhai Sancun Service Point】, prepare to send to 【Zhongshan Sanjiao Distribution Center】
2026-05-04 11:08:37 The shipment has departed from 【Zhuhai Sancun Service Point】 ,has been sent to 【Zhongshan Sanjiao Distribution Center】
2026-05-04 13:10:17 The shipment has arrived at 【Zhongshan Sanjiao Distribution Center】(Transfer)
2026-05-04 18:29:51 Shipment loaded at 【Zhongshan Sanjiao Distribution Center】, prepare to send to 【CN Guangdong Province Hourui Distribution Center】
2026-05-04 23:18:45 The shipment has departed from 【Zhongshan Sanjiao Distribution Center】 ,has been sent to 【CN Guangdong Province Hourui Distribution Center】
2026-05-05 05:15:53 The shipment has arrived at【CN Guangdong Province Hourui Distribution Center】
2026-05-05 05:53:43 Shipment loaded at 【CN Guangdong Province Hourui Distribution Center】, prepare to send to next station
2026-05-05 20:18:59 Under customs clearance, please wait patiently.
2026-05-06 09:27:47 Under customs clearance, please wait patiently.
2026-05-06 10:55:18 The shipment has arrived at【Taiwan Customs Group】
2026-05-06 10:55:19 The shipment has departed from Taiwan Customs Group ,has been sent to Taiwan Taoyuan Hub
2026-05-06 11:10:52 The shipment has arrived atTaiwan Taoyuan Hub
2026-05-06 14:05:45 In transit
2026-05-06 19:41:12 The shipment has arrived at【Taiwan Changhua Hub】
2026-05-06 19:42:50 In transit
2026-05-07 06:38:02 The shipment has arrived at【Wuri Distribution Center,Address:南区复兴路一段207巷15弄68号】
2026-05-07 08:47:37 The shipment has been handed over to and is being delivered by 乘騎-烏日1 (contact number: 0930....... Please answer the call at ease as your privacy is properly protected by "safety call"!)
2026-05-07 16:17:26 Signed by 3rd party (門衛). Thank you for using SF Express. Looking forward to serving you again.
#define iLED_esp32_c3_supermini 8
#define iLED_esp32_lolin_d32 5
int iLED=iLED_esp32_c3_supermini;
void setup()
{
pinMode(iLED, OUTPUT);
}
void loop()
{
digitalWrite(iLED, HIGH);
delay(500);
digitalWrite(iLED, LOW);
delay(500);
}
from machine import Pin
from time import sleep
# esp32 lolin d32 ledpin=5
led=Pin(5, Pin.OUT)
while True:
led.value(1)
sleep(0.5) # Wait 0.5 seconds
led.value(0)
sleep(0.5) # Wait 0.5 seconds