2022年6月14日

scratch3增加擴充積木(進階)

30天通github

https://github.com/doggy8088/Learn-Git-in-30-days

java script快速入門播放清單

https://youtube.com/playlist?list=PLxNBsYH_m6ywXdOfpVgibRbJzidecajoX

scratch-vm index.js結構

 //require基本架構

const ArgumentType = require('../../extension-support/argument-type');
const BlockType = require('../../extension-support/block-type');
const formatMessage = require('format-message');
const msg = require('./translation');

 

物件

class 物件名稱 {

//物件架構

  constructor(runtime) {
        the_locale = this._setLocale();
        this.runtime = runtime;
    }

//物件資料

  getInfo() {
        the_locale = this._setLocale();
        return {
            id: 'mqtt',
            color1: '#003D79', //'#0C5986',
            color2: '#34B0F7',
            name: 'MQTT',
            blockIconURI: 'data:image/png;base64,',
            blocks: [
                {

               }

}

function(){

}

module.exports = 物件名稱;


語系

方法1:

在index.js中有

const msg = require('./translation');

物件中要有function定義語系

_setLocale() {
        let now_locale = '';
        switch (formatMessage.setup().locale) {
            case 'zh-tw':
                now_locale = 'zh-tw';
                break;
            default:
                now_locale = 'en';
                break;
        }
        return now_locale;
    } 

物件架構是呼叫function定義語系

constructor(runtime) {
        the_locale = this._setLocale();
        this.runtime = runtime;
    }

使用方法:

msg.disconnect[the_locale];

在資料夾下,要有translation.js

 檔案內容:

export const disconnect = {
    'en': 'disconnected',
    'zh-tw': '未連線',
};

方法2:

在index.js中加入語系物件

const formatMessage = require('format-message');

const FormLcdShow = {
    'en': 'LCD show text [VALUE] at [ROW] row',
    'zh-tw': 'LCD顯示文字[VALUE]在第[ROW]列',
};

在物件中加入架構

constructor(runtime,util) {
        the_locale = this._setLocale();
        this.runtime = runtime;
    }

需要有function _setLocale()

_setLocale () {
        let now_locale = '';
        switch (formatMessage.setup().locale){
            case 'en':
                now_locale='en';
                break;
            case 'zh-tw':
                now_locale= 'zh-tw';
                break;
            default:
                now_locale='en';
                break;
        }
        return now_locale;
    }

使用方法

FormLcdShow [the_locale]


積木表示

在物件中使用陣列blocks: [ ]包括所有積木。

每個積木為一物件{}。內容為

opcode: 'digital_write',
                    blockType: BlockType.COMMAND,
                    text: FormDigitalWrite[the_locale],
                    arguments: {
                        PIN: {
                            type: ArgumentType.NUMBER,
                            defaultValue: 'D2',
                            menu: "digital_pins"
                        },

                     }

方法3:

/src/lib/libraries/extensions/index.jsx的

翻譯檔案在/node_modules/scratch-l10n/locales/editor-msgs.js

中文語系在最後面。

格式範例:

"gui.extension.microbitMore.description":"玩轉 micro:bit 的所有功能。(v2-0.2.4)",


2022年3月22日

npm build apk

産生金鑰檔

keytool -genkey -v -keystore 檔名.keystore -alias 別名osep -keyalg RSA -keysize 2048 -validity 10000
 
sudo npm install -g androidjs-builder
web data html file save to dir 
mkdir dir
cd dir  
androidjs init
npm install 
npm run start:dev 
npm run build
  
androidjs build --release
 
apk in dist direction  

2022年1月31日

esp32 arduino編譯LedControl.h錯誤

 #include <LedControl.h>

少了pgmspace.h這個檔案,但LedControl套件沒有avr資料夾。

 

拜神,找到,這裡有https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/pgmspace.h

把它放入LedControl套件裡(先建avr資料夾)。

編譯就成功了。

2022年1月25日

uno當bootloader

 遇到ch340燒錄死機。

解決方法:

1.找另一張正常的uno,當bootloader主板

2.接法:11 、12、13、5V、GND對接。usb線接在好的uno上,好的uno D10要接到有問題的uno reset孔。

3.好的uno燒錄範例檔Arduino ISP。

4.arduino ide 讀出要燒的ino

5.檢查arduino ide 的設定 board 和port 

6.按著好的uno 板子上的reset按鈕,滑鼠點下草稿碼/以燒錄器上傳,等約5-10秒,放掉reset按鈕,就看到開始燒錄。

接法可以參考網址:

https://forum.arduino.cc/t/uno-to-uno-bootloader/554994/4


如果bootloader可以燒成功,就可以回春了。

亂試一下,碰巧成功。做法如下

燒錄器先選AVR ISP,按著reset鈕不放,工具/燒錄bootloader,10秒左右放掉,這時會出現錯誤訊息,再把燒錄器選回Arduino as ISP,再按著reset鈕不放,工具/燒錄bootloader,10秒左右放開,就有機會燒成功,的板子我做了好幾次才成功,但把故障的板子啟回來,還不賴。

2021年12月17日

G5T感測器資料

資料來源:http://maker.tn.edu.tw/modules/tad_book3/page.php?tbsn=21&tbdsn=379

 PMS5003T 主動式傳輸協議
默認串列傳輸速率: 9600bps 校驗位:無 停止位: 1 位
協議總長度: 32 位元組 

1 起始符 1 0x42 (固定)
2 起始符 2 0x4d (固定)
3 幀長度高八位 幀長度=2x13+2(資料+校驗位元)
4 幀長度低八位
5 數據 1 高八位 *資料 1 表示 PM1.0 濃度(CF=1,標準顆粒物)單位μ g/m3
6 數據 1 低八位
7 數據 2 高八位 資料 2 表示 PM2.5 濃度(CF=1,標準顆粒物)
單位μ g/m3
8 數據 2 低八位
9 數據 3 高八位 資料 3 表示 PM10 濃度(CF=1,標準顆粒物)
單位μ g/m3
10 數據 3 低八位
11 數據 4 高八位 *資料 4 表示 PM1.0 濃度(大氣環境下)
單位μ g/m3
12 數據 4 低八位
13 數據 5 高八位 資料 5 表示 PM2.5 濃度(大氣環境下)
單位μ g/m3
14 數據 5 低八位
15 數據 6 高八位 資料 6 表示 PM10 濃度 (大氣環境下)
單位μ g/m3
16 數據 6 低八位
17 數據 7 高八位 資料 7 表示 0.1 升空氣中直徑在 0.3um 以上
顆粒物個數
18 數據 7 低八位
19 數據 8 高八位 資料 8 表示 0.1 升空氣中直徑在 0.5um 以上
顆粒物個數
20 數據 8 低八位
21 數據 9 高八位 資料 9 表示 0.1 升空氣中直徑在 1.0um 以上
顆粒物個數
22 數據 9 低八位
23 數據 10 高八位 資料 10 表示 0.1 升空氣中直徑在 2.5um 以上
顆粒物個數
24 數據 10 低八位
25 數據 11 高八位 溫度。 注:真實溫度值=本數值/10
單位:℃
26 數據 11 低八位
27 數據 12 高八位 濕度。 注:真實濕度值=本數值/10
單位:%
28 數據 12 低八位
29 數據 13 高八位 版本號
30 數據 13 低八位 錯誤代碼
31 資料和校驗高八位元 校驗碼=起始符 1+起始符 2+……..+數據 13 低八位
32 資料和校驗低八位元


 注:標準顆粒物質量濃度值是指用工業金屬顆粒物作為等效顆粒進行密度換算得到的品質濃度值,適用於工業生產車間等環境。大氣環境顆粒物質量濃度值以空氣中主要污染物為等效顆粒進行密度換算,適用于普通室內外大氣環境。

程式範例

#include <SoftwareSerial.h>
SoftwareSerial PmsSerial(2, 3); // RX, TX
 
static unsigned int pm_cf_10;           //定義全域變數
static unsigned int pm_cf_25;
static unsigned int pm_cf_100;
static unsigned int pm_at_10;
static unsigned int pm_at_25;
static unsigned int pm_at_100;
static unsigned int particulate03;
static unsigned int particulate05;
static unsigned int particulate10;
static unsigned int particulate25;
static float sencorT;
static float sencorH;
 
void getG5(unsigned char ucData)//獲取G5的值
{
  static unsigned int ucRxBuffer[250];
  static unsigned int ucRxCnt = 0;
  ucRxBuffer[ucRxCnt++] = ucData;
  if (ucRxBuffer[0] != 0x42 && ucRxBuffer[1] != 0x4D)//資料頭判斷
  {
    ucRxCnt = 0;
    return;
  }
  if (ucRxCnt > 32)//資料位元數判斷//G5T為32
  {
       pm_cf_10=(int)ucRxBuffer[4] * 256 + (int)ucRxBuffer[5];      //大氣環境下PM2.5濃度計算       
       pm_cf_25=(int)ucRxBuffer[6] * 256 + (int)ucRxBuffer[7];
       pm_cf_100=(int)ucRxBuffer[8] * 256 + (int)ucRxBuffer[9];
       pm_at_10=(int)ucRxBuffer[10] * 256 + (int)ucRxBuffer[11];              
       pm_at_25=(int)ucRxBuffer[12] * 256 + (int)ucRxBuffer[13];
       pm_at_100=(int)ucRxBuffer[14] * 256 + (int)ucRxBuffer[15];
       particulate03=(int)ucRxBuffer[16] * 256 + (int)ucRxBuffer[17];
       particulate05=(int)ucRxBuffer[18] * 256 + (int)ucRxBuffer[19];
       particulate10=(int)ucRxBuffer[20] * 256 + (int)ucRxBuffer[21];
       particulate25=(int)ucRxBuffer[22] * 256 + (int)ucRxBuffer[23];
       sencorT=((int)ucRxBuffer[24] * 256 + (int)ucRxBuffer[25])/10;
       sencorH=((int)ucRxBuffer[26] * 256 + (int)ucRxBuffer[27])/10;
       
        
    if (pm_cf_25 >  999)//如果PM2.5數值>1000,返回重新計算
    {
      ucRxCnt = 0;
      return;
    }
     
    ucRxCnt = 0;
    return;
  }
 
}
 
void setup() {
   PmsSerial.begin(9600);
   PmsSerial.setTimeout(1500);
   Serial.begin(9600);
   Serial.print("PM_CF1.0");Serial.print(",");
   Serial.print("PM_CF2.5");Serial.print(",");
   Serial.print("PM_CF10");Serial.print(",");
   Serial.print("PM_AQI1.0");Serial.print(",");
   Serial.print("PM_AQI2.5");Serial.print(",");
   Serial.print("PM_AQI10");Serial.print(",");
   Serial.print("PM_count03");Serial.print(",");
   Serial.print("PM_count05");Serial.print(",");
   Serial.print("PM_count10");Serial.print(",");
   Serial.print("PM_count25");Serial.print(",");
   Serial.print("Temperature");Serial.print(",");
   Serial.println("Humandity");
    
   Serial.print("(ug/m3)");Serial.print(",");
   Serial.print("(ug/m3)");Serial.print(",");
   Serial.print("(ug/m3)");Serial.print(",");
   Serial.print("(ug/m3)");Serial.print(",");
   Serial.print("(ug/m3)");Serial.print(",");
   Serial.print("(ug/m3)");Serial.print(",");
   Serial.print("(pcs/0.01cf)");Serial.print(",");
   Serial.print("(pcs/0.01cf)");Serial.print(",");
   Serial.print("(pcs/0.01cf)");Serial.print(",");
   Serial.print("(pcs/0.01cf)");Serial.print(",");
   Serial.print("(C)");Serial.print(",");
   Serial.println("(%)");
}
 
void loop() {
  while (PmsSerial.available()) {
    getG5(PmsSerial.read());
  }
  Serial.print(pm_cf_10);Serial.print(",");
  Serial.print(pm_cf_25);Serial.print(",");
  Serial.print(pm_cf_100);Serial.print(",");
  Serial.print(pm_at_10);Serial.print(",");
  Serial.print(pm_at_25);Serial.print(",");
  Serial.print(pm_at_100);Serial.print(",");
  Serial.print(particulate03);Serial.print(",");
  Serial.print(particulate05);Serial.print(",");
  Serial.print(particulate10);Serial.print(",");
  Serial.print(particulate25);Serial.print(",");
  Serial.print(sencorT);Serial.print(",");
  Serial.println(sencorH);
 
  delay(2000);
}