準備:
進入教學網站:www.myiot.idv.tw或 https://reurl.cc/W0qR85
登入Google 帳號
登入 ChatGPT 網址:https://chatgpt.com/ 或
Gemini 網址:https://gemini.google.com/app
下載 processing 網址:https://processing.org/ 解壓縮
啟動Arduino IDE,或下載後安裝 網址:https://www.arduino.cc/
連接上 Arduino 開發板,確認 板子型號(ARDUINO UNO)與序列埠(不使用COM1、COM2)。
使用ChatGPT產生一個LED閃爍程式,複製到Arduino來執行
告訴ChatGPT關於今天實驗用板子的設定:
可變電阻(A0)
Pull-down按鈕S1(A1)
Pull-down按鈕S2(A2)
Pull-down按鈕S3(A3)
LED4(D10)
LED3(D11)
LED2(D12)
LED1(D13)
蜂鳴器(D3)
74HC595 Latch(D4) | LED 顯示器控制
74HC595 Clock(D7) | LED 顯示器控制
74HC595 Data(D8) | LED 顯示器控制
共陽極七段顯示器設定
dp(bit7),G(bit6),F(bit5),E(bit4),D(bit3),C(bit2),B(bit1),A(bit0)
給ChatGPT一個範例程式:
/*Define shift register pins used for seven segment display */
#define LATCH_DIO 4
#define CLK_DIO 7
#define DATA_DIO 8
/* Segment byte maps for numbers 0 to 9 */
const byte SEGMENT_MAP[] ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90} ;
/* Byte maps to select digit 1 to 4 */
const byte SEGMENT_SELECT[] ={0xF1,0XF2,0XF4,0XF8};
void setup ()
{
/* Set DIO pins to outputs */
pinMode (LATCH_DIO,OUTPUT);
pinMode (CLK_DIO,OUTPUT) ;
pinMode (DATA_DIO,OUTPUT) ;
}
/* Main program */
void loop()
{
/* Update the display with the current counter value */
WriteNumberToSegment(0,0);
WriteNumberToSegment(1,1);
WriteNumberToSegment(2,2);
WriteNumberToSegment(3,3);
}
/* Write a decimal number between O and 9 to one of the 4 digits of the display */
void WriteNumberToSegment(byte Segment, byte Value)
{
digitalWrite(LATCH_DIO,LOW);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );
digitalWrite(LATCH_DIO,HIGH);
}
/*the sample END */
題目一:
寫一個程式讓七段顯示器從0000開始向上計數
題目二:
讓四位數七段顯示器的外圈 LED 繞圈顯示(類似跑馬燈效果)
題目三:
增加讓LED1到LED4流水燈的效果
題目四:
按下S1 七段顯示器從0099開始倒數計時,直到0000時停止動作
題目五:
可以理解程式工作的原理嗎?
準備:
進入教學網站:www.myiot.idv.tw或 https://reurl.cc/W0qR85
登入Google 帳號
登入 ChatGPT 網址:https://chatgpt.com/ 或
Gemini 網址:https://gemini.google.com/app
下載 processing 網址:https://processing.org/ 解壓縮
啟動Arduino IDE,或下載後安裝 網址:https://www.arduino.cc/
連接上 Arduino 開發板,確認 板子型號(ARDUINO UNO)與序列埠(不使用COM1、COM2)。
使用ChatGPT產生一個LED閃爍程式,複製到Arduino來執行
練習一:
4 位數 7 段顯示器模組,由兩顆串列 74HC595 晶片驅動
4 顆 LED 燈
10K 可變電阻器(電位器)
3 顆按鈕開關
壓電蜂鳴器
DS18B20 溫度感測器介面(感測器未附)
紅外線接收器介面
串列通訊接頭,可連接各種串列模組
led1 = D13;
led2 = D12;
led3 = D11;
led4 = D10;
BUTTON1= A1
BUTTON2= A2
BUTTON3= A3
/* Define shift register pins used for seven segment display */
LATCH_DIO =D4
CLK_DIO =D7
DATA_DIO =D8
A0 | Trimpot 輸出 | 可讀取旋鈕電壓值(0~1023)
A1 | S1 按鈕 | Pull-down 建議
A2 | S2 按鈕 | 同上
A3 | S3 按鈕 | 同上
A4 | 溫度感測器 U5 | 類比溫度資料
A5 | 3-pin 擴充頭 | 自由使用
D2 | 紅外線接收器輸出 | 可接收 IR 編碼訊號
D3 | Piezo 蜂鳴器 | 透過電晶體驅動(低電位觸發)
D4 | 74HC595 Latch | LED 顯示器控制
D5 | 3-pin 擴充頭(PWM) | 可用於 Servo、PWM 控制
D6 | 3-pin 擴充頭(PWM) | 同上
D7 | 74HC595 Clock | LED 顯示器控制
D8 | 74HC595 Data | LED 顯示器控制
D9 | 3-pin 擴充頭(PWM) | 同上
D10 | LED D4 | 顯示輸出
D11 | LED D3 | 同上
D12 | LED D2 | 同上
D13 | LED D1 | 同上
RESET | S4 按鈕 | 重置 Arduino
範例程式一:Blinking LED
********************************************************************
int led = 13;
void setup()
{
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
}
void loop()
{
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}
********************************************************************
範例程式二:All LEDS blinking
int led1 = 13;
int led2 = 12;
int led3 = 11;
int led4 = 10;
void setup()
{
// initialize the digital pin as an output.
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
}
void loop()
{
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
delay(1000);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
delay(1000);
}
********************************************************************
範例程式三:Switches example
const byte LED[] = {13,12,11,10};
#define BUTTON1 A1
#define BUTTON2 A2
void setup()
{
// initialize the digital pin as an output.
/* Set each pin to outputs */
pinMode(LED[0], OUTPUT);
pinMode(LED[1], OUTPUT);
pinMode(LED[2], OUTPUT);
pinMode(LED[3], OUTPUT);
}
void loop()
{
if(!digitalRead(BUTTON1))
{
digitalWrite(LED[0], HIGH);
digitalWrite(LED[1], HIGH);
digitalWrite(LED[2], HIGH);
digitalWrite(LED[3], HIGH);
}
if(!digitalRead(BUTTON2))
{
digitalWrite(LED[0], LOW);
digitalWrite(LED[1], LOW);
digitalWrite(LED[2], LOW);
digitalWrite(LED[3], LOW);
}
}
********************************************************************
範例程式四:segment display
/* Define shift register pins used for seven segment display */
#define LATCH_DIO 4
#define CLK_DIO 7
#define DATA_DIO 8
/* Segment byte maps for numbers 0 to 9 */
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};
/* Byte maps to select digit 1 to 4 */
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};
void setup ()
{
/* Set DIO pins to outputs */
pinMode(LATCH_DIO,OUTPUT);
pinMode(CLK_DIO,OUTPUT);
pinMode(DATA_DIO,OUTPUT);
}
/* Main program */
void loop()
{
/* Update the display with the current counter value */
WriteNumberToSegment(0 , 0);
WriteNumberToSegment(1 , 1);
WriteNumberToSegment(2 , 2);
WriteNumberToSegment(3 , 3);
}
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */
void WriteNumberToSegment(byte Segment, byte Value)
{
digitalWrite(LATCH_DIO,LOW);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );
digitalWrite(LATCH_DIO,HIGH);
}
********************************************************************
範例程式五:Potentiometer 1
#define Pot1 0
void setup()
{
Serial.begin(9600);
}
/* Main Program */
void loop()
{
Serial.print(“Potentiometer reading: “);
Serial.println(analogRead(Pot1));
/* Wait 0.5 seconds before reading again */
delay(500);
}
********************************************************************
範例程式六:Pot and led
[c]
const byte LED[] = {13,12,11,10};
#define Pot1 0
void setup()
{
Serial.begin(9600);
// initialize the digital pin as an output.
/* Set each pin to outputs */
pinMode(LED[0], OUTPUT);
pinMode(LED[1], OUTPUT);
pinMode(LED[2], OUTPUT);
pinMode(LED[3], OUTPUT);
}
/* Main Program */
void loop()
{
int PotValue;
//Serial.print(“Potentiometer reading: “);
PotValue = analogRead(Pot1);
/* Wait 0.5 seconds before reading again */
if(PotValue < 400)
{
digitalWrite(LED[0], LOW);
digitalWrite(LED[1], LOW);
digitalWrite(LED[2], LOW);
digitalWrite(LED[3], LOW);
Serial.print(“Potentiometer: “);
Serial.println(PotValue);
}
else
{
digitalWrite(LED[0], HIGH);
digitalWrite(LED[1], HIGH);
digitalWrite(LED[2], HIGH);
digitalWrite(LED[3], HIGH);
Serial.print(“Potentiometer: “);
Serial.println(PotValue);
}
delay(500);
}
********************************************************************
範例程式七:Read pot and display value on display
[c]
/* Define shift register pins used for seven segment display */
#define LATCH_DIO 4
#define CLK_DIO 7
#define DATA_DIO 8
#define Pot1 0
/* Segment byte maps for numbers 0 to 9 */
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};
/* Byte maps to select digit 1 to 4 */
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};
void setup ()
{
Serial.begin(9600);
/* Set DIO pins to outputs */
pinMode(LATCH_DIO,OUTPUT);
pinMode(CLK_DIO,OUTPUT);
pinMode(DATA_DIO,OUTPUT);
}
/* Main program */
void loop()
{
int PotValue;
PotValue = analogRead(Pot1);
Serial.print(“Potentiometer: “);
Serial.println(PotValue);
/* Update the display with the current counter value */
WriteNumberToSegment(0 , PotValue / 1000);
WriteNumberToSegment(1 , (PotValue / 100) % 10);
WriteNumberToSegment(2 , (PotValue / 10) % 10);
WriteNumberToSegment(3 , PotValue % 10);
}
/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */
void WriteNumberToSegment(byte Segment, byte Value)
{
digitalWrite(LATCH_DIO,LOW);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[Value]);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );
digitalWrite(LATCH_DIO,HIGH);
}
********************************************************************
今日重點:
讓Arduino的狀態呈現在processing上。
-----------------------------------------------------
------------------------------------------------------
使用ChatGPT 提示詞,產生程式碼:
【你是一位使用arduino IDE與processing的專家 】
【請在processing畫布上畫出紅色與藍色的圓形,一個白色的正方形,一個裡面有隻指向0度指標的白色的圓形,還有一個黃色的橢圓形,兩個白色的長方形。背景請用灰色。 】
【請將紅色圓形命名為RLED與藍色圓形命名為BLED,一個白色的正方形命名為3LED,一個裡面有隻指向0度指標的白色的圓形命名為VRA,還有一個黃色的橢圓形命名為CDS,兩個白色的長方形 左邊的命名為SWA,右邊的命名為SWB。 】
【用Arduino 顯示紅色LED(D12)與藍色LED(D13)間隔1秒交替閃爍。並且透過usb與上述processing 連線,當紅色LED亮的時候,RLED呈現紅色 】
解法之一:GITHUB
作業一:解析Arduino 程式架構
【請告訴我arduino程式設計架構 】
作業二: 控制WS2812 範例連結
【用arduino 程式讓ws2812 12LED依序點亮】
作業三: 一秒鐘點亮WS2812下一個LED,並且關閉現在的LED
作業四: 模擬一個電子輪盤
把你的帳號 XXXX 密碼抄錄在課本上
作業一:取用一個Arduino的板子,修改程式讓LED閃爍
作業二:兩個LED
// C++ code
//
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
pinMode(12, OUTPUT);
}
void loop()
{
digitalWrite(LED_BUILTIN, HIGH);
digitalWrite(12, HIGH);
delay(1000); // Wait for 1000 millisecond(s)
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(12, LOW);
delay(1000); // Wait for 1000 millisecond(s)
}
今天任務:
建立帳號:
◎ WOKWI:Arduino相關的模擬
◎ Gemini:Google 的AI 輔助程式
備用
tinkerCAD :繪製實體連接
W3CSchool:C語言練習
因才網:課程補充
ChatGPT:輔助AI程式
作業:
繪製 arduino 與 ws2812 12個環形LED ,並使用Gemmi來協助開發程式
參考答案:單一LED移動
Gemini 問答參考:
arduino 控制 ws2312:Gemini 用 FastLED 函式庫
使用 Adafruit_NeoPixel 函式庫 :但是WOKWI我是使用Adafruit_NeoPixel函式庫
讓LED逐一點亮,間隔0.5秒後換下一顆LED:讓LED開始逐一點亮
換下一個LED後,原先的LED要熄滅 :一次只有一顆LED亮起
同學的作品:
2024-05月 課程
實作AI輔助程式設計:
下載Processing 並且解壓縮
測試processing的問題
用processing 畫一個圓形。
延伸學習:改變圓形的顏色,改變背景的顏色,可以畫出正方形嗎?
用processing 寫一個與滑鼠互動的程式
延伸學習:改變成眼睛看滑鼠的位置
用processing 寫一個與滑鼠互動的遊戲
延伸學習:改成鍵盤操作
延伸學習:做一個打磚塊遊戲
AI輔助Arduino開發
啟動Arduino IDE程式
在ChatGPT說出:
你是一個程式設計師。對於開發arduino 程式很有經驗
請幫我寫一個讓LED燈亮0.5秒,熄滅0.7秒,反覆閃爍的程式
將程式複製後貼至arduino IDE中。
選擇正確的COM與模板,下載並執行
使用蕭維紀老師設計的控制板來發想創意的作品
add program
for(int c=0;c<255;c=c+10){
leds[0] = CRGB(c, 5, 255-c);
leds[1] = CRGB(0, c, 0);
leds[2]=CRGB(c, c, 36);
FastLED.show();
delay(100);
}
2023-10-30 七彩燈
#include "FastLED.h" // 此示例程序需要使用FastLED函式庫
#define NUM_LEDS 8 // ws2812 LED数量
#define LED_DT 27 // ESP32输出控制信号引脚
#define LED_TYPE WS2812 // LED型号
#define COLOR_ORDER GRB // RGB中红色、绿色、蓝色LED的排列顺序
uint8_t max_bright = 12; // LED亮度控制,可使用数值为 0 ~ 255, 数值越大则亮度越亮
CRGB leds[NUM_LEDS]; // 建立leds陣列,leds[0]最底下的
uint8_t beginHue = 0; //每次彩色燈光起始色彩,0~255
uint8_t offsetHue = 32; //每次彩色燈光起始點色彩間隔,0~255
uint8_t deltaHue = 8; //相鄰LED的色調差,0~255
int timer = 200; // The higher the number, the slower the timing.
void setup() {
LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS); // 初始化光带
FastLED.setBrightness(max_bright); // 设置光带亮度
}
void loop () {
// fill_rainbow演示
for (beginHue=0;beginHue<256;beginHue=beginHue+offsetHue){ //設定彩虹的顏色
fill_rainbow(leds, NUM_LEDS, beginHue, deltaHue);
FastLED.show();
delay(timer);
}
delay(1200);
}
2023-10-30 紅綠燈設計
#include "FastLED.h" // 此示例程序需要使用FastLED函式庫
#define NUM_LEDS 8 // ws2812 LED数量
#define LED_DT 27 // ESP32输出控制信号引脚
#define LED_TYPE WS2812 // LED型号
#define COLOR_ORDER GRB // RGB中红色、绿色、蓝色LED的排列顺序
uint8_t max_bright = 12; // LED亮度控制,可使用数值为 0 ~ 255, 数值越大则亮度越亮
CRGB leds[NUM_LEDS]; // 建立leds陣列,leds[0]最底下的
int rainbow16[8][3]={ //設定燈號顏色
{255, 0, 0}, //紅
{255, 255, 0}, //黃
{ 0, 255, 0}, //綠
{ 0, 0, 0}, //黑
{ 0, 0, 0}, //黑
{255, 0, 0}, //紅
{255, 255, 0}, //黃
{ 0, 255, 0}, //綠
};
int trtime[8]={3000,800,2200,5,5,3000,800,2200}; //設定每種燈光點亮時間
int j=0;
void setup() {
LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS); // 初始化LED光带
FastLED.setBrightness(max_bright); // 设置亮度
}
void loop () {
for(int i=0;i<NUM_LEDS/2;i++) //輪流設定亮燈順序
{
j=NUM_LEDS-i-1;
leds[i] = CRGB(rainbow16[i][0],rainbow16[i][1],rainbow16[i][2]); //從前面亮起
leds[j] = CRGB(rainbow16[j][0],rainbow16[j][1],rainbow16[j][2]); //從後面亮起
FastLED.show(); //亮燈
delay(trtime[i]); //延遲時間
FastLED.clear(); //關閉燈
}
}