2024年12月9日 星期一

[Python] 使用 Yahoo Finance API 的 yfinance 函式庫進行各種金融數據查詢

1. 安裝 yfinance 函式庫

pip install yfinance

2. 下載股票歷史數據

範例:下載台積電 (TSM) 的日線數據

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import yfinance as yf

# 設定股票代碼
ticker = 'TSM'

# 下載歷史數據
data = yf.download(ticker, start='2024-01-01', end='2024-06-01')

# 輸出數據的前五筆記錄
print(data.head())

執行結果:
Price        Adj Close       Close  ...        Open    Volume
Ticker             TSM         TSM  ...         TSM       TSM
Date                                ...                      
2024-01-02  100.430679  101.529999  ...  102.250000   9020900
2024-01-03   99.085411  100.169998  ...  100.339996   6650600
2024-01-04   98.056664   99.129997  ...   99.529999   7996700
2024-01-05   98.531471   99.610001  ...   99.000000   7344900
2024-01-08  101.132988  102.239998  ...  100.629997  12455600

[5 rows x 6 columns]

3. 下載多隻股票的數據
範例:下載特斯拉 (TSLA)、微軟 (MSFT)、亞馬遜 (AMZN) 的數據
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import yfinance as yf

# 設定多隻股票的代碼
tickers = ['TSLA', 'MSFT', 'AMZN']

# 下載股票數據
data = yf.download(tickers, start='2024-01-01', end='2024-06-01')

# 顯示數據
print(data['Close'].head())

執行結果:
Ticker            AMZN        MSFT        TSLA
Date                                          
2024-01-02  149.929993  370.869995  248.419998
2024-01-03  148.470001  370.600006  238.449997
2024-01-04  144.570007  367.940002  237.929993
2024-01-05  145.240005  367.750000  237.490005
2024-01-08  149.100006  374.690002  240.449997

4. 取得股票的財務報表
範例:查詢輝達 (NVDA) 的財務報表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import yfinance as yf

# 設定股票代碼
stock = yf.Ticker("NVDA")

# 取得財務報表
balance_sheet = stock.balance_sheet
income_statement = stock.financials
cashflow = stock.cashflow

# 顯示部分報表
print("資產負債表:")
print(balance_sheet)

print("\n損益表:")
print(income_statement)

print("\n現金流量表:")
print(cashflow)

執行結果:
資產負債表:
                                                     2024-01-31  ...     2020-01-31
Treasury Shares Number                                      NaN  ...  13700576960.0
Ordinary Shares Number                            24640000000.0  ...            NaN
Share Issued                                      24640000000.0  ...            NaN
Net Debt                                           2429000000.0  ...            NaN
Total Debt                                        11056000000.0  ...            NaN
...                                                         ...  ...            ...
Allowance For Doubtful Accounts Receivable                  NaN  ...    -11000000.0
Gross Accounts Receivable                                   NaN  ...   1668000000.0
Cash Cash Equivalents And Short Term Investments  25984000000.0  ...            NaN
Other Short Term Investments                      18704000000.0  ...            NaN
Cash And Cash Equivalents                          7280000000.0  ...            NaN

[84 rows x 5 columns]

損益表:
                                                       2024-01-31  ...     2021-01-31
Tax Effect Of Unusual Items                                   0.0  ...            0.0
Tax Rate For Calcs                                           0.12  ...          0.017
Normalized EBITDA                                   35583000000.0  ...   5691000000.0
Total Unusual Items                                           0.0  ...            0.0
Total Unusual Items Excluding Goodwill                        0.0  ...            0.0
Net Income From Continuing Operation Net Minori...  29760000000.0  ...   4332000000.0
Reconciled Depreciation                              1508000000.0  ...   1098000000.0
Reconciled Cost Of Revenue                          16621000000.0  ...   6279000000.0
EBITDA                                              35583000000.0  ...   5691000000.0
EBIT                                                34075000000.0  ...   4593000000.0
Net Interest Income                                   609000000.0  ...   -127000000.0
Interest Expense                                      257000000.0  ...    184000000.0
Interest Income                                       866000000.0  ...     57000000.0
Normalized Income                                   29760000000.0  ...   4332000000.0
Net Income From Continuing And Discontinued Ope...  29760000000.0  ...   4332000000.0
Total Expenses                                      27950000000.0  ...  12143000000.0
Total Operating Income As Reported                  32972000000.0  ...   4532000000.0
Diluted Average Shares                              24940000000.0  ...  25120000000.0
Basic Average Shares                                24690000000.0  ...  24680000000.0
Diluted EPS                                                 1.193  ...         0.1725
Basic EPS                                                   1.205  ...         0.1755
Diluted NI Availto Com Stockholders                 29760000000.0  ...   4332000000.0
Net Income Common Stockholders                      29760000000.0  ...   4332000000.0
Net Income                                          29760000000.0  ...   4332000000.0
Net Income Including Noncontrolling Interests       29760000000.0  ...   4332000000.0
Net Income Continuous Operations                    29760000000.0  ...   4332000000.0
Tax Provision                                        4058000000.0  ...     77000000.0
Pretax Income                                       33818000000.0  ...   4409000000.0
Other Income Expense                                  237000000.0  ...      4000000.0
Other Non Operating Income Expenses                   237000000.0  ...      4000000.0
Special Income Charges                                        0.0  ...            0.0
Restructuring And Mergern Acquisition                         0.0  ...            0.0
Net Non Operating Interest Income Expense             609000000.0  ...   -127000000.0
Interest Expense Non Operating                        257000000.0  ...    184000000.0
Interest Income Non Operating                         866000000.0  ...     57000000.0
Operating Income                                    32972000000.0  ...   4532000000.0
Operating Expense                                   11329000000.0  ...   5864000000.0
Research And Development                             8675000000.0  ...   3924000000.0
Selling General And Administration                   2654000000.0  ...   1940000000.0
Gross Profit                                        44301000000.0  ...  10396000000.0
Cost Of Revenue                                     16621000000.0  ...   6279000000.0
Total Revenue                                       60922000000.0  ...  16675000000.0
Operating Revenue                                   60922000000.0  ...  16675000000.0

[43 rows x 4 columns]

<未完>

[8051] 用CH552控制WS2812燈條

 電路圖:


採用範例程式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <WS2812.h>

#define NUM_LEDS 8
#define COLOR_PER_LEDS 3
#define NUM_BYTES (NUM_LEDS*COLOR_PER_LEDS)

#if NUM_BYTES > 255
#error "NUM_BYTES can not be larger than 255."
#endif

__xdata uint8_t ledData[NUM_BYTES];

void setup() {
  pinMode(15, OUTPUT); //Possible to use other pins. 
}

void loop() {

  for (uint8_t i = 0; i < NUM_LEDS; i++) {
    set_pixel_for_GRB_LED(ledData, i, 1, 0, 0); //Choose the color order depending on the LED you use. 
    neopixel_show_P1_5(ledData, NUM_BYTES); //Possible to use other pins. 
    delay(100);
  }
  for (uint8_t i = 0; i < NUM_LEDS; i++) {
    set_pixel_for_GRB_LED(ledData, i, 0, 1, 0);
    neopixel_show_P1_5(ledData, NUM_BYTES);
    delay(100);
  }
  for (uint8_t i = 0; i < NUM_LEDS; i++) {
    set_pixel_for_GRB_LED(ledData, i, 0, 0, 1);
    neopixel_show_P1_5(ledData, NUM_BYTES);
    delay(100);
  }

}


WS2812.h程式碼:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/*
 * Copyright (c) 2020 by Deqing Sun <ds@thinkcreate.us> (c version for CH552
 * port) Touch key library for arduino CH552.
 *
 * This file is free software; you can redistribute it and/or modify
 * it under the terms of either the GNU General Public License version 2
 * or the GNU Lesser General Public License version 2.1, both as
 * published by the Free Software Foundation.
 */

#ifndef _WS2812_H_INCLUDED
#define _WS2812_H_INCLUDED

// clang-format off
#include <Arduino.h>
#include "template/WS2812_pins_header.h"
// clang-format on

#define set_pixel_for_RGB_LED(ADDR, INDEX, R, G, B)                            \
  {                                                                            \
    __xdata uint8_t *ptr = (ADDR) + ((INDEX)*3);                               \
    ptr[0] = (R);                                                              \
    ptr[1] = (G);                                                              \
    ptr[2] = (B);                                                              \
  };
#define set_pixel_for_GRB_LED(ADDR, INDEX, R, G, B)                            \
  {                                                                            \
    __xdata uint8_t *ptr = (ADDR) + ((INDEX)*3);                               \
    ptr[0] = (G);                                                              \
    ptr[1] = (R);                                                              \
    ptr[2] = (B);                                                              \
  };
#define set_pixel_for_RBG_LED(ADDR, INDEX, R, G, B)                            \
  {                                                                            \
    __xdata uint8_t *ptr = (ADDR) + ((INDEX)*3);                               \
    ptr[0] = (R);                                                              \
    ptr[1] = (B);                                                              \
    ptr[2] = (G);                                                              \
  };
#define set_pixel_for_GBR_LED(ADDR, INDEX, R, G, B)                            \
  {                                                                            \
    __xdata uint8_t *ptr = (ADDR) + ((INDEX)*3);                               \
    ptr[0] = (G);                                                              \
    ptr[1] = (B);                                                              \
    ptr[2] = (R);                                                              \
  };
#define set_pixel_for_BRG_LED(ADDR, INDEX, R, G, B)                            \
  {                                                                            \
    __xdata uint8_t *ptr = (ADDR) + ((INDEX)*3);                               \
    ptr[0] = (B);                                                              \
    ptr[1] = (R);                                                              \
    ptr[2] = (G);                                                              \
  };
#define set_pixel_for_BGR_LED(ADDR, INDEX, R, G, B)                            \
  {                                                                            \
    __xdata uint8_t *ptr = (ADDR) + ((INDEX)*3);                               \
    ptr[0] = (B);                                                              \
    ptr[1] = (G);                                                              \
    ptr[2] = (R);                                                              \
  };

#endif


WS2812_pins_header.h的程式碼:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
// This file is generated by a script.

#ifndef _WS2812_PIND_HEADER_H_INCLUDED

#define _WS2812_PIND_HEADER_H_INCLUDED

void neopixel_show_long_P1_0(uint32_t dataAndLen);

#define neopixel_show_P1_0(ADDR, LEN)                                          \
  neopixel_show_long_P1_0((((uint16_t)(ADDR)) & 0xFFFF) |                      \
                          (((uint32_t)(LEN)&0xFF) << 16));

void neopixel_show_long_P1_1(uint32_t dataAndLen);

#define neopixel_show_P1_1(ADDR, LEN)                                          \
  neopixel_show_long_P1_1((((uint16_t)(ADDR)) & 0xFFFF) |                      \
                          (((uint32_t)(LEN)&0xFF) << 16));

void neopixel_show_long_P1_2(uint32_t dataAndLen);

#define neopixel_show_P1_2(ADDR, LEN)                                          \
  neopixel_show_long_P1_2((((uint16_t)(ADDR)) & 0xFFFF) |                      \
                          (((uint32_t)(LEN)&0xFF) << 16));

void neopixel_show_long_P1_3(uint32_t dataAndLen);

#define neopixel_show_P1_3(ADDR, LEN)                                          \
  neopixel_show_long_P1_3((((uint16_t)(ADDR)) & 0xFFFF) |                      \
                          (((uint32_t)(LEN)&0xFF) << 16));

void neopixel_show_long_P1_4(uint32_t dataAndLen);

#define neopixel_show_P1_4(ADDR, LEN)                                          \
  neopixel_show_long_P1_4((((uint16_t)(ADDR)) & 0xFFFF) |                      \
                          (((uint32_t)(LEN)&0xFF) << 16));

void neopixel_show_long_P1_5(uint32_t dataAndLen);

#define neopixel_show_P1_5(ADDR, LEN)                                          \
  neopixel_show_long_P1_5((((uint16_t)(ADDR)) & 0xFFFF) |                      \
                          (((uint32_t)(LEN)&0xFF) << 16));

void neopixel_show_long_P1_6(uint32_t dataAndLen);

#define neopixel_show_P1_6(ADDR, LEN)                                          \
  neopixel_show_long_P1_6((((uint16_t)(ADDR)) & 0xFFFF) |                      \
                          (((uint32_t)(LEN)&0xFF) << 16));

void neopixel_show_long_P1_7(uint32_t dataAndLen);

#define neopixel_show_P1_7(ADDR, LEN)                                          \
  neopixel_show_long_P1_7((((uint16_t)(ADDR)) & 0xFFFF) |                      \
                          (((uint32_t)(LEN)&0xFF) << 16));

void neopixel_show_long_P3_0(uint32_t dataAndLen);

#define neopixel_show_P3_0(ADDR, LEN)                                          \
  neopixel_show_long_P3_0((((uint16_t)(ADDR)) & 0xFFFF) |                      \
                          (((uint32_t)(LEN)&0xFF) << 16));

void neopixel_show_long_P3_1(uint32_t dataAndLen);

#define neopixel_show_P3_1(ADDR, LEN)                                          \
  neopixel_show_long_P3_1((((uint16_t)(ADDR)) & 0xFFFF) |                      \
                          (((uint32_t)(LEN)&0xFF) << 16));

void neopixel_show_long_P3_2(uint32_t dataAndLen);

#define neopixel_show_P3_2(ADDR, LEN)                                          \
  neopixel_show_long_P3_2((((uint16_t)(ADDR)) & 0xFFFF) |                      \
                          (((uint32_t)(LEN)&0xFF) << 16));

void neopixel_show_long_P3_3(uint32_t dataAndLen);

#define neopixel_show_P3_3(ADDR, LEN)                                          \
  neopixel_show_long_P3_3((((uint16_t)(ADDR)) & 0xFFFF) |                      \
                          (((uint32_t)(LEN)&0xFF) << 16));

void neopixel_show_long_P3_4(uint32_t dataAndLen);

#define neopixel_show_P3_4(ADDR, LEN)                                          \
  neopixel_show_long_P3_4((((uint16_t)(ADDR)) & 0xFFFF) |                      \
                          (((uint32_t)(LEN)&0xFF) << 16));

void neopixel_show_long_P3_5(uint32_t dataAndLen);

#define neopixel_show_P3_5(ADDR, LEN)                                          \
  neopixel_show_long_P3_5((((uint16_t)(ADDR)) & 0xFFFF) |                      \
                          (((uint32_t)(LEN)&0xFF) << 16));

void neopixel_show_long_P3_6(uint32_t dataAndLen);

#define neopixel_show_P3_6(ADDR, LEN)                                          \
  neopixel_show_long_P3_6((((uint16_t)(ADDR)) & 0xFFFF) |                      \
                          (((uint32_t)(LEN)&0xFF) << 16));

void neopixel_show_long_P3_7(uint32_t dataAndLen);

#define neopixel_show_P3_7(ADDR, LEN)                                          \
  neopixel_show_long_P3_7((((uint16_t)(ADDR)) & 0xFFFF) |                      \
                          (((uint32_t)(LEN)&0xFF) << 16));

#endif

2024年12月8日 星期日

[8051] 用CH552讀取語音IC的狀態

參考資訊:PXT-ASRPlanetX_MicroPython

電路圖:


程式碼:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <Arduino.h>

#define SDA_PIN 31 // 定義 SDA 為 P2
#define SCL_PIN 30  // 定義 SCL 為 P3

#define I2C_DELAY_US 5  // I²C 時鐘延遲 (調整延遲來控制速率)

// 語音設備 I²C 位址
#define VOICE_I2C_ADDR 0x0B

// 初始化 I²C 線路
void i2c_init() {
  pinMode(SDA_PIN, OUTPUT);
  pinMode(SCL_PIN, OUTPUT);
  digitalWrite(SDA_PIN, HIGH);
  digitalWrite(SCL_PIN, HIGH);
}

// 產生 I²C 起始信號
void i2c_start() {
  digitalWrite(SDA_PIN, HIGH);
  digitalWrite(SCL_PIN, HIGH);
  delayMicroseconds(I2C_DELAY_US);
  digitalWrite(SDA_PIN, LOW);
  delayMicroseconds(I2C_DELAY_US);
  digitalWrite(SCL_PIN, LOW);
}

// 產生 I²C 停止信號
void i2c_stop() {
  digitalWrite(SDA_PIN, LOW);
  digitalWrite(SCL_PIN, HIGH);
  delayMicroseconds(I2C_DELAY_US);
  digitalWrite(SDA_PIN, HIGH);
  delayMicroseconds(I2C_DELAY_US);
}

// 傳送 1 個位元
void i2c_send_bit(bool bit) {
  digitalWrite(SDA_PIN, bit);
  delayMicroseconds(I2C_DELAY_US);
  digitalWrite(SCL_PIN, HIGH);
  delayMicroseconds(I2C_DELAY_US);
  digitalWrite(SCL_PIN, LOW);
}

// 接收 1 個位元
bool i2c_read_bit() {
  pinMode(SDA_PIN, INPUT);
  delayMicroseconds(I2C_DELAY_US);
  digitalWrite(SCL_PIN, HIGH);
  delayMicroseconds(I2C_DELAY_US);
  bool bit = digitalRead(SDA_PIN);
  digitalWrite(SCL_PIN, LOW);
  pinMode(SDA_PIN, OUTPUT);
  return bit;
}

// 傳送 1 個位元組 (8 位元) 並讀取 ACK/NACK
bool i2c_write_byte(uint8_t data) {
  for (uint8_t i = 0; i < 8; i++) {
    i2c_send_bit(data & 0x80);
    data <<= 1;
  }
  // 接收 ACK/NACK
  return !i2c_read_bit();  // 0: ACK, 1: NACK
}

// 讀取 1 個位元組 (8 位元)
uint8_t i2c_read_byte(bool ack) {
  uint8_t data = 0;
  for (uint8_t i = 0; i < 8; i++) {
    data <<= 1;
    if (i2c_read_bit()) {
      data |= 0x01;
    }
  }
  i2c_send_bit(!ack);  // 傳送 ACK (0) 或 NACK (1)
  return data;
}

// 寫入資料到 I²C 裝置
bool i2c_write(uint8_t addr, uint8_t *data, uint8_t len) {
  i2c_start();
  if (!i2c_write_byte(addr << 1)) {  // 傳送寫入位址
    i2c_stop();
    return false;
  }
  for (uint8_t i = 0; i < len; i++) {
    if (!i2c_write_byte(data[i])) {  // 傳送資料
      i2c_stop();
      return false;
    }
  }
  i2c_stop();
  return true;
}

// 從 I²C 裝置讀取資料
bool i2c_read(uint8_t addr, uint8_t *buffer, uint8_t len) {
  i2c_start();
  if (!i2c_write_byte((addr << 1) | 1)) {  // 傳送讀取位址
    i2c_stop();
    return false;
  }
  for (uint8_t i = 0; i < len; i++) {
    buffer[i] = i2c_read_byte(i < (len - 1));  // 除了最後一個位元組外,都傳送 ACK
  }
  i2c_stop();
  return true;
}

// 讀取語音 I²C 設備的資料
bool read_voice_data(uint8_t *buffer, uint8_t len) {
  return i2c_read(VOICE_I2C_ADDR, buffer, len);  // 從語音設備讀取資料
}

void setup() {

  i2c_init();
}

void loop() {
  uint8_t voice_data[2];  // 用來接收語音設備的資料

  // 從語音設備讀取資料
  if (read_voice_data(voice_data, 1)) {
    USBSerial_print("Voice Data: ");
    USBSerial_println(voice_data[0], HEX);  // 顯示語音設備的第1個位元組
  } else {
    USBSerial_print("Failed to read voice data\n");
  }

  delay(100);  // 等待 100 msec
}

執行結果:
Voice Data: 0
Voice Data: 1
Voice Data: 0
Voice Data: 0
Voice Data: 0
Voice Data: 0
Voice Data: 0
Voice Data: 0
Voice Data: 11

2024年12月7日 星期六

[8051] CH552初接觸-拍手聲控馬達

電路圖:




零件:CH552、EF92-A  micro:servo 180、KS0035 Microphone Sound Sensor with Potentiometer

程式碼:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <Servo.h>
const int analogInPin = 11;  
const int servoPin = 15; 
int threshold = 60;

int sensorValue = 0;        // value read from the pot

void setup() {
  pinMode(analogInPin,INPUT);
  Servo_init();
  pinMode(servoPin, OUTPUT);
  Servo_attach(servoPin);
}

void loop() {
  // read the analog in value:
  sensorValue = analogRead(analogInPin);
  
  USBSerial_print("sensor = ");
  USBSerial_print(sensorValue);
    USBSerial_print("\n");
 
  if (sensorValue>=threshold){
    Servo_write(servoPin,90);
    delay(1000);
    Servo_write(servoPin,0);
    delay(1000);
    Servo_write(servoPin,180);
    delay(1000);
    Servo_write(servoPin,0);
    delay(1000);
    Servo_write(servoPin,90);

  }
  delay(2);
}

2024年12月4日 星期三

[樹藝:micro:bit] 時尚兔玩AI

 

主要材料:樹藝、micro:bit、Smart AI Lens

MakeCode程式碼:


Python程式:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
def on_button_pressed_a():
    global ID
    ID = (ID + 1) % 6
    basic.show_string("" + str((ID)))
    if ID == 0:
        PlanetX_AILens.switchfunc(PlanetX_AILens.FuncList.CARD)
    else:
        PlanetX_AILens.switchfunc(PlanetX_AILens.FuncList.THINGS)
    basic.pause(3000)
input.on_button_pressed(Button.A, on_button_pressed_a)

def doLight():
    if RUN == 0 or (RUN == 5 or RUN == 11):
        pins.digital_write_pin(DigitalPin.P1, 1)
        pins.digital_write_pin(DigitalPin.P2, 0)
        pins.digital_write_pin(DigitalPin.P13, 0)
        pins.digital_write_pin(DigitalPin.P14, 0)
        pins.digital_write_pin(DigitalPin.P15, 0)
    elif RUN == 1 or (RUN == 6 or RUN == 12):
        pins.digital_write_pin(DigitalPin.P1, 0)
        pins.digital_write_pin(DigitalPin.P2, 1)
        pins.digital_write_pin(DigitalPin.P13, 0)
        pins.digital_write_pin(DigitalPin.P14, 0)
        pins.digital_write_pin(DigitalPin.P15, 0)
    elif RUN == 2 or (RUN == 7 or RUN == 13):
        pins.digital_write_pin(DigitalPin.P1, 0)
        pins.digital_write_pin(DigitalPin.P2, 0)
        pins.digital_write_pin(DigitalPin.P13, 1)
        pins.digital_write_pin(DigitalPin.P14, 0)
        pins.digital_write_pin(DigitalPin.P15, 0)
    elif RUN == 3 or (RUN == 8 or RUN == 14):
        pins.digital_write_pin(DigitalPin.P1, 0)
        pins.digital_write_pin(DigitalPin.P2, 0)
        pins.digital_write_pin(DigitalPin.P13, 0)
        pins.digital_write_pin(DigitalPin.P14, 1)
        pins.digital_write_pin(DigitalPin.P15, 0)
    elif RUN == 4 or (RUN == 9 or RUN == 15):
        pins.digital_write_pin(DigitalPin.P1, 0)
        pins.digital_write_pin(DigitalPin.P2, 0)
        pins.digital_write_pin(DigitalPin.P13, 0)
        pins.digital_write_pin(DigitalPin.P14, 0)
        pins.digital_write_pin(DigitalPin.P15, 1)
def checkCard():
    global RUN
    if PlanetX_AILens.number_card(PlanetX_AILens.numberCards.ZERO) and RUN != 0:
        RUN = 0
        radio.send_number(10)
        basic.show_number(0)
    elif PlanetX_AILens.number_card(PlanetX_AILens.numberCards.ONE) and RUN != 1:
        RUN = 1
        radio.send_number(1)
        basic.show_number(1)
    elif PlanetX_AILens.number_card(PlanetX_AILens.numberCards.TWO) and RUN != 2:
        RUN = 2
        radio.send_number(2)
        basic.show_number(2)
    elif PlanetX_AILens.number_card(PlanetX_AILens.numberCards.THREE) and RUN != 3:
        RUN = 3
        radio.send_number(3)
        basic.show_number(3)
    elif PlanetX_AILens.number_card(PlanetX_AILens.numberCards.FOUR) and RUN != 4:
        RUN = 4
        radio.send_number(9)
        basic.show_number(4)
    elif PlanetX_AILens.number_card(PlanetX_AILens.numberCards.FIVE) and RUN != 5:
        RUN = 5
        radio.send_number(5)
        basic.show_number(5)
    elif PlanetX_AILens.number_card(PlanetX_AILens.numberCards.SIX) and RUN != 6:
        RUN = 6
        radio.send_number(4)
        basic.show_number(6)
    elif PlanetX_AILens.number_card(PlanetX_AILens.numberCards.SEVEN) and RUN != 7:
        RUN = 7
        radio.send_number(8)
        basic.show_number(7)
    elif PlanetX_AILens.number_card(PlanetX_AILens.numberCards.EIGHT) and RUN != 8:
        RUN = 8
        radio.send_number(7)
        basic.show_number(8)
    elif PlanetX_AILens.number_card(PlanetX_AILens.numberCards.NINE) and RUN != 9:
        RUN = 9
        radio.send_number(6)
        basic.show_number(9)

def on_button_pressed_b():
    if ID == 1:
        PlanetX_AILens.learn_object(PlanetX_AILens.learnID.ID1)
    elif ID == 2:
        PlanetX_AILens.learn_object(PlanetX_AILens.learnID.ID2)
    elif ID == 3:
        PlanetX_AILens.learn_object(PlanetX_AILens.learnID.ID3)
    elif ID == 4:
        PlanetX_AILens.learn_object(PlanetX_AILens.learnID.ID4)
    elif ID == 5:
        PlanetX_AILens.learn_object(PlanetX_AILens.learnID.ID4)
    basic.pause(6000)
input.on_button_pressed(Button.B, on_button_pressed_b)

def checkLOGO():
    global RUN
    if PlanetX_AILens.object_check(PlanetX_AILens.learnID.ID1) and RUN != 11:
        RUN = 11
        basic.show_string("A")
        radio.send_number(16)
    elif PlanetX_AILens.object_check(PlanetX_AILens.learnID.ID2) and RUN != 12:
        RUN = 12
        basic.show_string("B")
        radio.send_number(17)
    elif PlanetX_AILens.object_check(PlanetX_AILens.learnID.ID3) and RUN != 13:
        RUN = 13
        basic.show_string("C")
        radio.send_number(18)
    elif PlanetX_AILens.object_check(PlanetX_AILens.learnID.ID4) and RUN != 14:
        RUN = 14
        basic.show_string("D")
        radio.send_number(19)
    elif PlanetX_AILens.object_check(PlanetX_AILens.learnID.ID5) and RUN != 15:
        RUN = 15
        basic.show_string("E")
        radio.send_number(20)
RUN = 0
ID = 0
basic.show_icon(IconNames.HEART)
PlanetX_AILens.init_module()
PlanetX_AILens.switchfunc(PlanetX_AILens.FuncList.CARD)
ID = 0
basic.show_leds("""
    . # . . #
    # . # . #
    # # # . #
    # . # . #
    # . # . #
    """)
RUN = 0
radio.set_group(49)
pins.digital_write_pin(DigitalPin.P1, 0)
pins.digital_write_pin(DigitalPin.P2, 0)
pins.digital_write_pin(DigitalPin.P13, 0)
pins.digital_write_pin(DigitalPin.P14, 0)
pins.digital_write_pin(DigitalPin.P15, 0)
Old_Run = 0
count = 12
LED_status = 0

def on_every_interval():
    global LED_status, count, Old_Run
    if Old_Run == RUN:
        if count > 10:
            if LED_status == 0:
                LED_status = 1
                pins.digital_write_pin(DigitalPin.P1, 1)
                pins.digital_write_pin(DigitalPin.P2, 1)
                pins.digital_write_pin(DigitalPin.P13, 1)
                pins.digital_write_pin(DigitalPin.P14, 1)
                pins.digital_write_pin(DigitalPin.P15, 1)
            else:
                LED_status = 0
                pins.digital_write_pin(DigitalPin.P1, 0)
                pins.digital_write_pin(DigitalPin.P2, 0)
                pins.digital_write_pin(DigitalPin.P13, 0)
                pins.digital_write_pin(DigitalPin.P14, 0)
                pins.digital_write_pin(DigitalPin.P15, 0)
        else:
            count = count + 1
    else:
        Old_Run = RUN
        count = 0
loops.every_interval(500, on_every_interval)

def on_forever():
    PlanetX_AILens.camera_image()
    if ID == 0:
        checkCard()
    else:
        checkLOGO()
    if count < 10:
        doLight()
    basic.pause(200)
    basic.show_leds("""
        . # . . #
        # . # . #
        # # # . #
        # . # . #
        # . # . #
        """)
basic.forever(on_forever)

[樹藝micro:bit]歡樂蛙聽語音

 

主要材料:樹藝、micro:bit、語音辨識IC
MakeCode程式碼:


Python程式碼:
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
def on_asr_vocabulary_list_learning_entry_7():
    strip.show_rainbow(1, 360)
    radio.send_number(16)
    basic.show_string("Craft")
asr.on_asr(asr.vocabularyList.LEARNING_ENTRY_7,
    on_asr_vocabulary_list_learning_entry_7)

def on_asr_vocabulary_list_learning_entry_6():
    strip.show_rainbow(1, 360)
    radio.send_number(17)
    basic.show_string("NFU")
asr.on_asr(asr.vocabularyList.LEARNING_ENTRY_6,
    on_asr_vocabulary_list_learning_entry_6)

def on_button_pressed_a():
    asr.set_asr_learn()
    basic.show_leds("""
        # . . . .
        # . . . .
        # . . . .
        # . . . .
        # # # # .
        """)
input.on_button_pressed(Button.A, on_button_pressed_a)

def on_asr_vocabulary_list_learning_entry_8():
    strip.show_rainbow(1, 360)
    radio.send_number(19)
    basic.show_string("Smart")
asr.on_asr(asr.vocabularyList.LEARNING_ENTRY_8,
    on_asr_vocabulary_list_learning_entry_8)

def on_asr_vocabulary_list_learning_entry_10():
    strip.show_rainbow(1, 360)
    radio.send_number(20)
    basic.show_string("Tree Art")
asr.on_asr(asr.vocabularyList.LEARNING_ENTRY_10,
    on_asr_vocabulary_list_learning_entry_10)

def on_asr_vocabulary_list_learning_entry_4():
    basic.show_leds("""
        # # . # #
        # # . # #
        # . # . #
        # . . . #
        . # # # .
        """)
    strip.show_color(neopixel.colors(NeoPixelColors.PURPLE))
    strip.show()
asr.on_asr(asr.vocabularyList.LEARNING_ENTRY_4,
    on_asr_vocabulary_list_learning_entry_4)

def on_button_pressed_b():
    asr.del_asr_learn()
    basic.show_leds("""
        . # # # .
        # . . . .
        # . . . .
        # . . . .
        . # # # .
        """)
input.on_button_pressed(Button.B, on_button_pressed_b)

def on_asr_vocabulary_list_learning_entry_5():
    basic.show_leds("""
        # . . . #
        # . # . #
        # . # . #
        # . . . #
        . # # # .
        """)
    strip.show_color(neopixel.colors(NeoPixelColors.GREEN))
    strip.show()
asr.on_asr(asr.vocabularyList.LEARNING_ENTRY_5,
    on_asr_vocabulary_list_learning_entry_5)

def on_asr_vocabulary_list_learning_entry_9():
    strip.show_rainbow(1, 360)
    radio.send_number(18)
    basic.show_string("STEAM")
asr.on_asr(asr.vocabularyList.LEARNING_ENTRY_9,
    on_asr_vocabulary_list_learning_entry_9)

def on_asr_vocabulary_list_learning_entry_2():
    basic.show_leds("""
        . # # # .
        # . . . #
        # . . . #
        # . . . #
        . # # # .
        """)
    strip.show_color(neopixel.colors(NeoPixelColors.BLACK))
    strip.show()
asr.on_asr(asr.vocabularyList.LEARNING_ENTRY_2,
    on_asr_vocabulary_list_learning_entry_2)

def on_asr_vocabulary_list_learning_entry_3():
    basic.show_leds("""
        . # # # .
        # # # # #
        # # # # #
        # # # # #
        . # # # .
        """)
    strip.show_color(neopixel.colors(NeoPixelColors.RED))
    strip.show()
asr.on_asr(asr.vocabularyList.LEARNING_ENTRY_3,
    on_asr_vocabulary_list_learning_entry_3)

def on_asr_vocabulary_list_hi_shaun():
    basic.show_icon(IconNames.HEART)
    radio.send_number(0)
asr.on_asr(asr.vocabularyList.HI_SHAUN, on_asr_vocabulary_list_hi_shaun)

def on_asr_vocabulary_list_learning_entry_1():
    basic.show_leds("""
        . # . # .
        # . # . #
        . # . # .
        # . # . #
        . # . # .
        """)
    strip.show_rainbow(1, 360)
    radio.send_number(1)
asr.on_asr(asr.vocabularyList.LEARNING_ENTRY_1,
    on_asr_vocabulary_list_learning_entry_1)

strip: neopixel.Strip = None
basic.show_icon(IconNames.HAPPY)
strip = neopixel.create(DigitalPin.P0, 32, NeoPixelMode.RGB)
strip.show_rainbow(1, 360)
radio.set_group(49)

def on_forever():
    strip.rotate(1)
    strip.show()
    basic.pause(sonar.ping(DigitalPin.P1, DigitalPin.P2, PingUnit.CENTIMETERS) * 10)
basic.forever(on_forever)

[樹藝micro:bit] 唱唱鼠說故事

 

主要零件:樹藝材料、micro:bit、MP3播放器

MakeCode程式碼:


Python程式碼:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
def sayStory():
    basic.show_number(count)
    basic.pause(1000)
    mp3Player.set_tracking(count + 1, mp3Player.repeatList.NO)
    mp3Player.set_volume(volumn)
    mp3Player.execute(mp3Player.playType.PLAY)

def on_received_number(receivedNumber):
    global count
    if receivedNumber == 10:
        count = 0
        sayStory()
    elif receivedNumber == 6:
        count = 9
        sayStory()
    elif receivedNumber == 7:
        count = 8
        sayStory()
    elif receivedNumber == 8:
        count = 7
        sayStory()
    elif receivedNumber == 9:
        count = 4
        sayStory()
    elif receivedNumber >= 16 and receivedNumber <= 20:
        count = receivedNumber - 1
        sayStory()
    elif receivedNumber == 1:
        count = 1
        sayStory()
    elif receivedNumber == 2:
        count = 2
        sayStory()
    elif receivedNumber == 3:
        count = 3
        sayStory()
    elif receivedNumber == 4:
        count = 6
        sayStory()
    elif receivedNumber == 5:
        count = 5
        sayStory()
radio.on_received_number(on_received_number)

# 0.歡樂蛙
# 1.歡樂猪
# 2.智齡鳥
# 3.酷烗猪
# 4.行動牛
# 5.亮亮鼠
# 6.彩虹鳥
# 7.蓪草燈
# 8.先知鳥
# 9.時尚兔

def on_button_pressed_a():
    global count
    mp3Player.execute(mp3Player.playType.STOP)
    count = (count + 1) % 20
    sayStory()
input.on_button_pressed(Button.A, on_button_pressed_a)

def on_button_pressed_b():
    global volumn
    volumn = (volumn + 1) % 30
    basic.show_number(volumn)
    mp3Player.set_volume(volumn)
input.on_button_pressed(Button.B, on_button_pressed_b)

def on_pin_pressed_p1():
    global count
    mp3Player.execute(mp3Player.playType.STOP)
    count = (count + 1) % 20
    sayStory()
input.on_pin_pressed(TouchPin.P1, on_pin_pressed_p1)

volumn = 0
count = 0
basic.show_icon(IconNames.HEART)
count = 0
volumn = 15
mp3Player.mp3_set_serial(SerialPin.P2)
mp3Player.execute(mp3Player.playType.STOP)
loud_sound = 1
radio.set_group(49)