2024年7月28日 星期日

Arduino 筆記(下)

<<:左移運算子,將數字 1 向左移 x 個位元。

| :"或 / or"運算子。將兩個運算元的對應位元進行或運算,只要有一個位元為 1,結果的對應位元就為 1。任一為1 為1,否則為 0 一。

& :"和 / and"運算子。將兩個運算元的對應位元進行或運算,只要有兩個位元為 1,結果的對應位元就為 1。倆著為1 為1,否則為 0 一。

頻率(f):在每單位時間內(即每秒)重複發生的次數(週期數,即循環次數)

週期(T):定義為重複事件發生的最小時間間隔。


同底數(冪)相乘,底數不變,指數相加:

a^m*a^n=a^(m+n)

同底數(冪)相除,底數不變,指數相減:

a^m/a^n=a^(m-n)

同指數(冪)相除,指數不變,底數相除(b不為0)

a^n/b^n=(a/b)^n

Atmega328P 的默認時鐘頻為8MHz。

-------------------------------------------------

"CLKPR" 是 Clock Prescaler Register 的縮寫,中文翻譯為「時鐘預分頻器寄存器」

"CLKPCE" 通常是指 "Clock Prescaler Change Enable" 的縮寫,中文翻譯為「時鐘預分頻器更改啟用」, 它是一個控制位。

"TCCR0A" 是指 Timer/Counter 0 的控制(C)寄存器 A。(0210/584) 控制 TCNT0 的計數模式 , 時鐘源波形模式比較器

"TCCR0B" 是指 Timer/Counter 0 的控制(C)寄存器 B。(0211/589)

"OCRnB"  Output Compare Register nB 的縮寫。(0253/937)

"OCFnB  Output Compare Flag nB 的縮寫,中文翻譯為「輸出比較旗標 nB」。(256/960)

"TCNT0" 是指 Timer/Counter 0 的計數器寄存器。(0208/576)

"TIFR0" 是 Timer/Counter 0 Interrupt Flag Register 的縮寫,中文翻譯為"計時器/計數器中斷標誌寄存器 0"

"TOV0”是 Timer/Counter Overflow Flag 0 的縮寫,中文翻譯為「計數器溢出旗標 0」

"OCFnA Output Compare Flag nA 的縮寫,中文翻譯為「輸出比較旗標 nA」。(0255/952)


"OCRnA"  Output Compare Register nA 的縮寫。

"OCRnA"  "OCRnB" 都是輸出比對寄存器,

"OCFnX "是微控制器 (MCU) 中輸出比較模組 (Output Compare Module) 的一個旗標 (flag)。

"CTC模式”通常被翻譯為“單週期計數模式” CTC模式)。CTC 模式是一種定時器操作模式,定時器從 0 計數到比較值(OCRx),然後重設為



2024年7月21日 星期日

二進制中,一般寫法 0xF2 其中字母大小寫有分嗎?另外 0x01 與 0x1 及 0x00 與 0x0 相同嗎?

在十六進位表示法(一種使用基數 16 表示數字的方法)中,字母不區分大小寫。這意味著十六進位數 0xF2 相當於 0xf2、0XF2和0xHf2。十六進制數字可以是大寫或小寫,並且表示的值保持不變。

這種不區分大小寫的情況是由於十六進制數字的編碼方式所造成的。每個十六進位數字對應於 16 進位數字系統中的一個特定值:

0到9:以對應的數字表示(0、1、2、3 、... 、9 )

A到F:用字母A到F表示,對應16進位的值10到15

由於底層值表示不受字母大小寫的影響,因此十六進制數字被認為不區分大小寫。


關於第二個問題:

0x01和0x1代表相同的值,即十進制的1。

0x00和0x0代表同一個值,都是十進制的0。

這是因為十六進位表示法中的前導零不會影響所表示的值。十六進制數的值由其數字的組合決定,從最高有效數字開始,向最低有效數字移動。在 0x01 和 0x00 的情況下,單一數字 1 或 0 是唯一有效的數字,前導零對整體值沒有貢獻。

2024年7月19日 星期五

此($2^8-1$) 中$代表何意?

 01. 此($2^8-1$) 中$代表何意?

在數學中,符號 $ 表示一個數學表達式的開始或結束,這在許多數學文獻中是常見的用法。在這個上下文中,$2^8-1$ 是一個數學表達式,表示計算 

28 的值然後減去 1。

這個表示法在數學和程式設計中都很常見,特別是在討論位元運算和計數器時。

2. 為什麼8位元數值的最大值是255而不是256 ?

8 位元數值的最大值是 255 而不是 256,是因為在二進位計算中,8 個位元可以表示的最大數值是 11111111,換算成十進位就是 255。以下是更詳細的解釋:

二進位計算

在二進位計算中,每個位元可以是 0 或 1。從右到左,每個位元的權重是 $2^0, 2^1, 2^2, ..., 2^7$。一個 8 位元的二進位數字可以表示的範圍是:00000000(2) to 11111111(2)

十進位換算

將這些二進位數字換算成十進位,可以得到:
00000000_{(2)}&=0\times 2^7+0\times 2^6+0\times 2^5+0\times 2^4+0\times 2^3+0\times 2^2+0\times 2^1+0\times 2^0=0_{(10)}\\11111111_{(2)}&=1\times 2^7+1\times 2^6+1\times 2^5+1\times 2^4+1\times 2^3+1\times 2^2+1\times 2^1+1\times 2^0\\&=128+64+32+16+8+4+2+1=255_{(10)}\end{align*}$$所以8位元的二進位數字的最大值是11111111,換算成十進位就是255。##總結8位元可以表示的數值範圍是從0到255,共計256個數值。但是最大值是255而不是256,是因為0也算作一個數值,所以實際上只有256個數值,從0到255。

2024年7月17日 星期三

C++ 中 TCNT0

 

 01.TCNT0 Timer-0 的計數器值。它是一個 8 位的計數器,範圍從 0 2550x00 0xFF)。

02.總個數(10進位) 255+1=256

2024年5月18日 星期六

早期 蛋餅 粉漿配方

 早期 蛋餅 粉漿配方

三人份:

高筋麵粉 150g

太白粉 30g

地瓜粉 30g

油,糖 各3小匙(茶)

鹽 1/2匙

水 330ml



2024年4月14日 星期日

即溶咖啡沖泡時水溫幾度為宜 (微酸時) ?

 Gemini 回復:

一般來說,即溶咖啡的沖泡水溫以80-90度之間為宜。水溫過高會使咖啡口感變苦,水溫過低則會使咖啡口感偏酸。

如果您喜歡微酸的咖啡,可以嘗試將水溫控制在80-85度之間。這樣可以使咖啡的酸味更加柔和,同時保留咖啡的香氣。

以下是即溶咖啡沖泡的具體步驟:

準備好即溶咖啡粉、熱水和杯子。

將2克即溶咖啡粉放入杯中。

先倒入少量熱水(約30毫升),攪拌均勻,使咖啡粉完全溶解。

再加入剩下的熱水(約100毫升),攪拌均勻即可。

在沖泡即溶咖啡時,需要注意以下幾點:

使用新鮮的熱水。如果使用放置過久的熱水,咖啡的風味會受到影響。

不要直接將沸水倒入咖啡粉中,否則會使咖啡口感變苦。

沖泡後,可以根據自己的喜好添加牛奶、糖、蜂蜜等。

希望以上信息對您有所幫助。

2024年4月4日 星期四

報章雜誌常常說每天喝咖啡不能超過多少杯,請問這 "咖啡" 的規格是?

 Gemini:

一般來說,報章雜誌所說的 "咖啡" 是指沖泡好的咖啡,而非咖啡豆。一杯咖啡的容量約為 240 毫升 (標準的 8 盎司 (237 毫升) 的美式咖啡杯。這是一種常見的標準規格。),因此每天喝咖啡不能超過多少杯,通常是指咖啡因的攝取量不能超過多少毫克。

根據美國食品藥品管理局 (FDA) 的建議,健康成年人每天的咖啡因攝取量不應超過 400 毫克。孕婦、哺乳期婦女和兒童的咖啡因攝取量應更低。

咖啡因的含量會因咖啡的種類、烘焙程度、沖泡方式和飲用量而異。一般來說,一杯濃縮咖啡 (Espresso) 的咖啡因含量約為 60 毫克,一杯濾掛咖啡 (Drip coffee) 的咖啡因含量約為 95 毫克,一杯美式咖啡 (Americano) 的咖啡因含量約為 150 毫克。

因此,如果每天喝 4 杯濃縮咖啡、3 杯濾掛咖啡或2 杯美式咖啡,就可能攝取超過 400 毫克的咖啡因。

以下是一些常見咖啡的咖啡因含量:

咖啡種類  -  咖啡因含量 (毫克)

濃縮咖啡 (Espresso)      60

濾掛咖啡 (Drip coffee)  95

美式咖啡 (Americano)  150

拿鐵咖啡 (Latte)   75

卡布奇諾 (Cappuccino) 75

冰咖啡 (Iced coffee)      150

速溶咖啡 (Instant coffee)      60-150

無咖啡因咖啡 (Decaffeinated coffee)  2-5

如果您擔心自己的咖啡因攝取量,可以選擇無咖啡因咖啡或減少咖啡的飲用量。

以下是一些減少咖啡因攝取量的建議:

選擇無咖啡因咖啡或低咖啡因咖啡。

減少咖啡的飲用量。

避免在下午或晚上喝咖啡。

將咖啡與其他飲料交替飲用,例如水、茶或果汁。

如果您有任何健康問題,請諮詢醫生以了解您應該攝取多少咖啡因。

註:即溶咖啡 建議沖調比例:每1.8公克咖啡加150毫升熱水沖調。咖啡因含量:60毫克 (每份咖啡為1.8公克的咖啡因含量)。2. 120ml 水加1.44即溶咖啡。含48毫克咖啡因,48/400=8.333杯咖啡。

2024年3月16日 星期六

有益身體方法

 

1,多吃蔬菜 2,午休半小時 3,少吃紅肉,4,吃魚 5,每天走路一小時, 6 多動腦活動, 7 多喝水, 8 食用堅果, 9,有社交聊天, 10 長曬太陽,忙碌勞動。

2024年3月4日 星期一

Excel 中的參照位置

 Excel 中的

參照位置

參照位置是指一個儲存格或範圍在工作表中的位置。它由兩個部分組成:

**列標籤:**表示儲存格所在的列,例如 A、B、C 等。

**行號:**表示儲存格所在的行,例如 1、2、3 等。

例如,儲存格 A1 的參照位置為 A1。

絕對參照位置

絕對參照位置始終指向同一個單元格或範圍,即使公式被複製或移動到其他位置。絕對參照位置使用美元符號 ($) 表示。例如:

$A$1:始終指向儲存格 A1。

相對參照位置

相對參照位置相對於公式所在的位置進行調整。當公式被複製或移動到其他位置時,相對參照位置會自動更新。例如:

A1:相對於公式所在的位置。如果公式複製到 B2,則參照位置變為 B2。

混合參照位置

混合參照位置結合了絕對和相對參照。例如:

$A1:列絕對引用,行相對引用。如果公式複製到 B2,則參照位置變為 $A2。

A$1:列相對引用,行絕對引用。如果公式複製到 B2,則參照位置變為 B$1。

用途

參照位置用於在公式中指定儲存格或範圍。例如:

=A1+B1:將儲存格 A1 和 B1 的值相加。

=SUM(A1:B10):將範圍 A1 到 B10 中所有值的總和。

=IF(A1>B1, "大於", "小於"):如果儲存格 A1 大於儲存格 B1,則返回 "大於",否則返回 "小於"。

參照位置可以幫助您創建動態且可重用的公式,這些公式可以根據其位置自動調整。

2024年2月2日 星期五

紅燒豬腳用豬的前腳還是後腳腳有肉?

 

紅燒豬腳通常使用豬的後腳,因為後腳的肉質較豐富,含有較多的肌肉。豬腿部位是豬身上的大塊肌肉,有著豐富的肉質和筋絡,適合慢燉或紅燒的烹調方式。


製作紅燒豬腳的過程中,通常會先將豬腿切成塊狀,然後用慢燉或紅燒的方式,讓豬腿的肉質變得軟嫩,並充分吸收烹調液體的風味。這樣製作出來的紅燒豬腳,肉質多汁、鮮嫩,搭配著豐富的調味汁,味道十分美味。


總的來說,不同的菜式可能使用不同的部位,但製作紅燒豬腳時,一般而言會選擇使用豬的後腳。

2024年1月27日 星期六

詢問 AI 常用語詞

 01. '???' 在Ardunio 中 , 其繁體中文如何翻譯 ?

 02. '???' 在Ardunio 中 , 其繁體中文如何翻譯 ? 並舉例 !

2024年1月26日 星期五

AI : 請用繁體中文詳細解說下Arduino中millis()函式及其功能功用?

 GPT3.5 請用繁體中文詳細解說下Arduino中millis()函式及其功能功用?


millis() 函數是Arduino程式中的一個內建函數,用來獲取自程式開始運行以來的毫秒數。這個函數在許多應用中非常實用,特別是當你需要在程式中追踪時間的過程或執行定時操作時。


以下是對 millis() 函數的詳細解說:


取得毫秒數:

millis() 函數返回一個 unsigned long(無符號長整數),表示自Arduino板開始運行以來的毫秒數。這個數字會隨著時間的流逝而增加。

>>>>

unsigned long currentMillis = millis();

用途 - 跟蹤時間:

最常見的用途是在程式中跟蹤時間。例如,當你需要確定某個操作發生多久以前,或者當你需要執行某個操作的時間間隔時,你可以使用 millis() 來記錄時間戳記。

>>>>

unsigned long previousMillis = millis();

處理定時操作:


millis() 可以用於實現定時操作,例如在一定的時間間隔內執行某些代碼。通過與上一次的時間戳記進行比較,你可以確定是否已經過了一定的時間。

>>>>>

unsigned long interval = 1000;  // 1秒

unsigned long currentMillis = millis();


if (currentMillis - previousMillis >= interval) {

  // 在每秒執行的代碼

  // ...

  

  // 更新上一次的時間戳記

  previousMillis = currentMillis;

}

避免阻塞:


與 delay() 不同,millis() 可以用於實現非阻塞的時間等待。你可以在程式中進行其他操作,同時定期檢查是否已經過了指定的時間。

>>>>>

unsigned long startTime = millis();

unsigned long duration = 5000;  // 5秒


while (millis() - startTime < duration) {

  // 在等待的同時執行其他操作

  // ...

}

總體而言,millis() 函數是一個強大的工具,用於處理時間相關的操作,特別是在需要非阻塞和定時操作的Arduino程式中。

我的第一次:請 AI幫我寫 Arduino 程式 (1)

台大生物機電工程系(生機系)郭教授  Arduino 的第二堂課匆匆解釋了下面這問題一下就過了 !! 連程式碼都沒有甚是奇怪?想想用 AI 有一段時間了現在試試幫我寫一段程式看看 !

 撰寫一個 Arduino 程式 他能執行以下功能

Build a circuit that composes of an LED and a button

• Blink the LED at

• 2Hz when the button is pressed

• ½ Hz when the button is released

CGPT3.5 回復:

以下是一個簡單的Arduino程式,實現了按下按鈕時LED閃爍2Hz,釋放按鈕時LED閃爍0.5Hz的功能。在這個例子中,我們使用Digital Pin 2作為按鈕的輸入,Digital Pin 13作為LED的輸出。

const int buttonPin = 2;  // 按鈕接線到Digital Pin 2

const int ledPin = 13;    // LED接線到Digital Pin 13

int buttonState = 0;      // 記錄按鈕的狀態

unsigned long previousMillis = 0;  // 記錄上一次閃爍的時間

const long intervalOn = 500;       // 按下按鈕時LED閃爍的時間間隔 (2Hz)

const long intervalOff = 2000;     // 釋放按鈕時LED閃爍的時間間隔 (0.5Hz)


void setup() {

  pinMode(ledPin, OUTPUT);

  pinMode(buttonPin, INPUT);

}


void loop() {

  buttonState = digitalRead(buttonPin);


  // 檢查按鈕是否被按下

  if (buttonState == HIGH) {

    // 按下按鈕時LED閃爍2Hz

    blinkLED(2);

  } else {

    // 釋放按鈕時LED閃爍0.5Hz

    blinkLED(0.5);

  }

}


void blinkLED(float frequency) {

  unsigned long currentMillis = millis();


  // 計算閃爍的時間間隔

  long interval = 1000 / (2 * frequency);


  // 判斷是否過了閃爍的時間間隔

  if (currentMillis - previousMillis >= interval) {

    // 記錄當前時間

    previousMillis = currentMillis;


    // 切換LED狀態

    if (digitalRead(ledPin) == HIGH) {

      digitalWrite(ledPin, LOW);

    } else {

      digitalWrite(ledPin, HIGH);

    }

  }

}

這個程式中,我們使用了millis()函數來跟蹤時間,以便在指定的頻率下閃爍LED。按下按鈕時,閃爍頻率設置為2Hz,釋放按鈕時,閃爍頻率設置為0.5Hz。


Bard(實驗版)

// 定義 LED 和按鈕的接腳

const int ledPin = 13;

const int buttonPin = 2;


// 定義 LED 的閃爍頻率

const int blinkInterval = 1000 / 2; // 2Hz

const int halfBlinkInterval = 1000 / (2 * 2); // ½ Hz


// 初始化 LED 和按鈕

void setup() {

  pinMode(ledPin, OUTPUT);

  pinMode(buttonPin, INPUT);

}


// 主回圈

void loop() {

  // 讀取按鈕的狀態

  int buttonState = digitalRead(buttonPin);


  // 如果按鈕按下

  if (buttonState == HIGH) {

    // 以 2Hz 閃爍 LED

    digitalWrite(ledPin, HIGH);

    delay(blinkInterval);

    digitalWrite(ledPin, LOW);

    delay(blinkInterval);

  } else {

    // 如果按鈕釋放

    // 以 ½ Hz 閃爍 LED

    digitalWrite(ledPin, HIGH);

    delay(halfBlinkInterval);

    digitalWrite(ledPin, LOW);

    delay(halfBlinkInterval);

  }

}

請謹慎使用程式碼。了解詳情

此程式首先定義 LED 和按鈕的接腳。然後,它定義 LED 的閃爍頻率。在主回圈中,程式會讀取按鈕的狀態。如果按鈕按下,程式會以 2Hz 閃爍 LED。如果按鈕釋放,程式會以 ½ Hz 閃爍 LED。


您可以使用以下電路來實現此程式:


LED

 |

 |

 |   10kΩ

 |

 |

GND

LED 的正極連接到 Arduino 板上的 13 接腳。LED 的負極連接到 Arduino 板上的 GND 接腳。按鈕的其中一端連接到 Arduino 板上的 2 接腳。按鈕的另一端連接到 Arduino 板上的 GND 接腳。

您可以將此程式修改為執行其他功能。例如,您可以修改程式以使 LED 閃爍不同的顏色。


Google AI Studio

const int ledPin = 13;

const int buttonPin = 2;

int buttonState = 0;

int ledState = 0;

unsigned long previousMillis = 0;

const long interval = 1000; // 1 second


void setup() {

  pinMode(ledPin, OUTPUT);

  pinMode(buttonPin, INPUT);

}


void loop() {

  buttonState = digitalRead(buttonPin);

  unsigned long currentMillis = millis();


  if (buttonState == HIGH) {

    if (ledState == LOW) {

      digitalWrite(ledPin, HIGH);

      ledState = HIGH;

      previousMillis = currentMillis;

    } else if (ledState == HIGH && (currentMillis - previousMillis >= interval / 2)) {

      digitalWrite(ledPin, LOW);

      ledState = LOW;

      previousMillis = currentMillis;

    }

  } else {

    if (ledState == HIGH) {

      digitalWrite(ledPin, HIGH);

      ledState = HIGH;

      previousMillis = currentMillis;

    } else if (ledState == LOW && (currentMillis - previousMillis >= interval)) {

      digitalWrite(ledPin, LOW);

      ledState = LOW;

      previousMillis = currentMillis;

    }

  }

}

```


這個程式使用了無符號整數變數 `previousMillis` 來儲存前一次按鈕狀態改變的時間。程式還使用了常數 `interval` 來定義 LED 閃爍的間隔。


當按鈕按下時,程式會以 2Hz 的頻率閃爍 LED。當按鈕釋放時,程式會以 ½ Hz 的頻率閃爍 LED。


您可以使用以下電路來實現此程式:


LED

 |

 |

 |   10kΩ

 |

 |

GND

LED 的正極連接到 Arduino 板上的 13 接腳。LED 的負極連接到 Arduino 板上的 GND 接腳。按鈕的其中一端連接到 Arduino 板上的 2 接腳。按鈕的另一端連接到 Arduino 板上的 GND 接腳。

您可以將此程式修改為執行其他功能。例如,您可以修改程式以使 LED 閃爍不同的顏色。