2022年7月24日 星期日

3個7Segment的計數器

3個7Segment的計數器


接線:

1.請使用單一個 7-segment  的接線圖

2.新增兩個 7-segment,把 abcdefg 七條線並聯

3.重點--藍色線: arduino的pin 9,10,11 分別接到三顆七段顯示器的共陽(pin3),pin9接最左邊(最高位數)

工作原理:

一、抓出數字的百位數,十位數,個位數

    if(dig==0)   { x=cnt%10; }   // 個位數

    if(dig==1)   { x=(cnt/10)%10;}   // 十位數

    if(dig==2)   { x=cnt/100; }   // 百位數

二、三顆七段顯示器其實是個別顯示的,利用視覺暫留的原理,看起來是同時顯示的。

  for(int kk=0;kk<10;kk++)  <-------重複顯示10次
  {
    for(int dig=0;dig<3;dig++) 
    {
        ****設定哪一顆顯示器可使用(enable)****
        **** digitalWrite(11,HIGH); <----  HIGH 就是啟用
    
         for(int k=0;k<8;k++)    <----------送出資料,其實是同時送給三顆
         {      digitalWrite(seg7P[k],bitRead(segCode[x],k));           } 

          delay(10) ;  <----讓這一個數字顯示10ms
 
        } // for dig
     } //  for kk 持續一段時間  

   **** 每一組三位數數字實際顯示的時間是  10ms x 10 = 100ms

三、殘影---怎麼解決?


四、程式


2022年7月19日 星期二

七段顯示器、二進位編碼、 計時器

七段顯示器、二進位編碼、 計時器
參考書: 超圖解Arduino互動設計,旗標出版社,趙英傑著
 
七段顯示器( 7-Segment ) 接腳圖
7 segment 接線:




2.數字編碼



3. 共陽極 vs 共陰極



4. 共陽極腳位編碼轉成16進位 : 0x01,0x4f,0x12,0x06,0x4C,0x24,0x20,0x0f,0x00,0x04
     A-10 , B-11, C-12, D-13, E-14 , F-15

5. 程式執行概念




6.程式碼
( 轉到 html 編碼 script ---> Gist.github.com )


7.一個位元的計數器
( 轉到 html 編碼 script ---> Gist.github.com )

2022年7月18日 星期一

Tinkercad Circuits:LED 模擬走馬燈

 二、Tinkercad Circuits:LED 模擬走馬燈




  1. Arduino UNO R3 x 1
  2. Small Breadboard x 10
  3. 220 ohm Resistor x 10
  4. LED x 10




程式1: 用for迴圈控制,讓全部LED同時閃爍 程式2: 用for迴圈控制,讓LED輪流閃爍 程式3: 用for迴圈控制,讓LED流動

TinkerCAD 01 第一個電路 LED

 TinkerCAD 01 第一個電路 LED 

TinkerCAD 第一個電路測試: 連接LED正負極,測試LED的反應: 亮/不亮/燒毀 ?


https://www.ledinside.com.tw/knowledge/20121022-23498.html
LED的電流:LED的正向極限(IF)電流多在20MA
LED的電壓:通常所說的LED是正向電壓,就是說LED的正極接電源正極,負極接電源負極。電壓與顏色有關係
紅、黃、黃綠的電壓是1.8—2.4v之間
白、藍、翠綠的電壓是3.0—3.6v之間

1.不使用電組,LED電壓是多少?

2.使用電組
  電阻值怎麼看? 


1,.歐姆定律 E=IR, R=E/I = 1.5V / 20mA = 75歐姆(最小)
    請試用不同大小的電阻,試試看LED的亮度如何
2. 麵包板的並聯




2022年4月20日 星期三

list + for

 python list + for 串列與for綜合運用

#a生8科成績,計算總和及平均
a=[45,67,89,56,34,56,77,88]
print(a)

#印出每一科成績
for i in rangelen(a)):   #range(10)=0~9 ,  0~n-1
   print("科目" , i , "=" , a[i] )

print("----------------------")
#列印每一科成績跟60分的差距
# 科目0= -15
# 科目1= 7 
for i in rangelen(a)):
  print("科目" , i , "跟60分的差距=" , a[i]-60 )


#列印每一科成績是不是及格
print("----------------------")
for i in rangelen(a)):
  print("科目" , i , "=" , a[i] ,end="")
  if(a[i]>=60) : 
    print("及格")  
  else:
    print("不及格")

sum=0
for i in rangelen(a)):
   sum = sum + a[i]
print("總和=",sum)
print("平均=",sum/8)

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

#用亂數產生a生8科成績,計算總和及平均
import random
a=[]
for i in range(8): 
  a.append(random.randint(1,100))

sum=0
for i in rangelen(a)):
   sum = sum + a[i]
print(a)
print("總和=",sum)
print("平均=",sum/8)

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

#用亂數產生10個學生8科成績,計算總和及平均
import random
tmp=[];
a=[]
for j in range(10):
 tmp=[] 
 for i in range(8): 
   tmp.append( random.randint(1,100))  # tmp=[82, 11, 80, 11, 86, 98, 2, 7]--->8筆成績
 a.append( tmp )   
print(a)

for i in range(10):
   sum=0
   for j in range(8):
    sum = sum + a[i][j];
   print("總和=",sum)
   print("平均=",sum/8)

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

#用亂數產生a,b,c三個學生每個人8科成績,計算各科總和(subject_sum[])及個人總和(sum_a,sum_b,sum_c)
import random
a=[]; b=[] ; c=[]
for i in range(8): 
  a.append(random.randint(1,100))
  b.append(random.randint(1,100))
  c.append(random.randint(1,100))

sum_a=0 ; sum_b=0 ; sum_c=0
for i in range(8):
  sum_a += a[i]
  sum_b += b[i]
  sum_c += c[i]
print(a,sum_a) ; print(b,sum_b) ; print(c,sum_c)

#各科總和
subject_sum=[]
for i in range(8): subject_sum.append(0)  # sum起始值
for i in range(8):
  subject_sum[i]=a[i]+b[i]+c[i]
print(subject_sum)

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

# for迴圈與字串操作----大數運算
a="88888888888888888999"   #20位數
b="22222222222222222456"
c=[]
for i in range(21): c.append(0)  #21位數

# 加法
carry=0   #進位
for i in range(19,-1,-1):
  x=int(a[i])+ int(b[i])+ carry
  if( x>=10 ):
    c[i+1]=x-10   # c 多一位數
    carry=1
  else:
    c[i+1]=x
    carry=0 
c[i]=carry   # 第0位=進位
print(c)



for loop

 # 印出1-10, 兩種印法

for i in range(10):   # 0~9
  print(i+1 ,  ","  , end="")

for i in range(10):
  print(i+1)

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

# 請印出 1~100 3 的倍數,不斷行
for i in range(100):
  if( i%3 ==0) : 
    print(i,",",end="")

# 請印出 1~100 3and5 的倍數,不斷行
# A and B ---> A,B同時成立 , A or B --> A或B 其中一個成立  ,not A --> A不成立
print()
print("印出 1~100 3and5 的倍數--->",end="")
for i in range(100):
 if( i%3==0 and i%5==0): 
   print(i,",",end="")

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

# 印出 100 個星星,不斷行
for i in range(100): print("*",end="")
print()

# 印出 10x10 的星星方塊
for i in range(10):
  print(i,end="")
  for j in range(10):
    print("* ",end="")
  print()  

for i in range(10):
  print(i,end="")
  for j in range(10):
    print(j," ",end="")
  print() 

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

# 巢狀迴圈
for i in range(1,6):
  for j in range(1,6):
    print(i,",",j)

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

# 印出三角形
for i  in range(10):
  for j in range(i): print("*",end="")
  print()

for i  in range(10,0,-1):
  for j in range(i): print("*",end="")
  print()

# python特有的寫法
for i  in range(10): print(" "*(12-i) + "*"*i )

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

# 印聖誕樹

2022年4月6日 星期三

Python list +for

 Python list 串列 

#-----------------------------------------------程式--------
#串列list宣告, 陣列array 
list1=[11,22,33,44,55,66,77
# index 索引 = 0,1,2,3,4,5,6
# len( list1 )= 7 

#引用元素
print( list1[0], list1[1], list1[2])

#呼叫全部
print(list1)
for i in range(7):   # range(7)=0,1,2,3,4,5,6
   print( list1[i],end=",")
print()   #空行
for s in list1:
   print(s,end=",")

#-----------------------------------------------程式--------
#字串型內容
apple=["香蕉","芭樂","蘋果","流連","葡萄"]
for s in apple: 
  print(s,end=",")


#-----------------------------------------------程式--------
#求總和 1
score=[11,22,33,44,55,66,77]
sum=0
for i in rangelen(score) ) :  #length
   # len(score)=7, range(len(score))=range(7)=0~6
   #print(score[i],end="'")
   print(sum,"=",sum,"+",score[i],end="")
   sum=sum+score[i]    # <-----縮排,跑了7次
   print"---> sum=",sum )
print()
print("sum=" , sum )

#------------------------------------文字==結果----
0 = 0 + 11---> sum= 11 11 = 11 + 22---> sum= 33 33 = 33 + 33---> sum= 66 66 = 66 + 44---> sum= 110 110 = 110 + 55---> sum= 165 165 = 165 + 66---> sum= 231 231 = 231 + 77---> sum= 308 sum= 308

#-----------------------------------------------程式--------
#求總和 2  <----注意, sum的位置不一樣
score=[11,22,33,44,55,66,77]
sum=0
for i in rangelen(score)) :
  print(i,end=",")
print()
print("i=",i)
sum=sum+score[i] # <----注意, sum的位置不一樣
          ## <-----沒有縮排,不在for裡面,跑了1次
print("sum=" , sum )
print("why? sum=77 ")
print(".......自已填............")

#-----------------------------------------------程式--------
#自動產生100個數字, 排序
import random   #外掛,亂數
list2=[]
for i in range(100):
  list2.append( random.randint(1,100) )
print( list2 )

list2.sort()
print( list2 )

list2.reverse()
print( list2 )

#-----------------------------------------------程式--------
# 搜尋, 計算找到幾個元素
import random
list2=[]
for i in range(100):
  list2.append(random.randint(1,100))
print( list2 )

x=int(input("請輸入一個數字做search.."))  # input-->字串
for i in range(100):   # i=0~99
  if(x==list2[i]):    # list2[0] ~ list2[99] , 
    # a=5 assign ,  a==5 compare,傳回直=True/False
    print(i,list2[i])  # i=index , list[i]=直
   
#計算找到幾個元素--自己算
cnt=0
for i in range(100):
  if(x==list2[i]): 
    cnt+=1   # cnt=cnt+1
print("There are", cnt ,"elements in List2 (自己算)" )

#計算找到幾個元素--用現有的函式
print("There are", list2.count(x),"elements in List2 (count)" )


#-----------------------------------------------程式--------
## Home Work 1
# 產生100個元素的陣列list3, 再產生一個空的陣列odd(奇數),even(偶數)
# 將list3的奇數copy到odd,將list3的=偶數copy到even,排序後印出
import random
list3=[]
for i in range(100):
  list3.append(random.randint(1,100))
print( list3 )
list3.sort()

odd=[]
even=[]
for i in range(100):
  if( list3[i] %2 ==1 ):  # % 取餘數 , ==比較(是不是等於),結果=True/false
    odd.append( list3[i] )
  else:
    even.append( list3[i] )
print( odd )
print( even )

# HomeWork 請計算奇數數字和,偶數數字的和


#-----------------------------------------------程式--------
# Home work 2
# 產生一個list,如下 [1,2,3,,,,,,100]
# 計算總和sum跟平均值average
import random
list3=[]
for i in range(100):
  list3.append(random.randint(1,100))
print( list3 )

sum=0
for i in range100 ) :
   sum=sum+list3[i] 
print("sum=" , sum )
print("averge=" , sum/100 )

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

#統計list內每一個元素的數量
import random
list4=[]
for i in range(300): list4.append(random.randint(1,50))
print( list4 )

#count
list4.sort()
print(list4)
x=list4[0]
cnt=0
for i in range(300):
  if(x != list4[i]):
    print(x," 有 ", list4.count(x),",",cnt,"個")
    x=list4[i]
    cnt=0
  cnt+=1

2022年3月23日 星期三

loop_range_for_while

 list1=range(10)

list2=range(1,10)

list3=range(1,10,2)

list4=range(10,1,-2)

print(list(list1))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print(list(list2))  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

print(list(list3))  # [1, 3, 5, 7, 9]

print(list(list4))  # [10, 8, 6, 4, 2]

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

n = int(input("請輸入正整數:"))

for i in range(1, n+1):

    print(i,end=" ")

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

sum = 0

n = int(input("請輸入正整數:"))

for i in range(1, n+1):

    sum += i

print("1 到 %d 的整數和為 %d" % (n, sum))

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

for i in range(1,6): #外部迴圈,共執行5次

    print("外部第",i,"次迴圈,內部執行",i,"次迴圈: ",end="")

    for j in range(1,i+1): #內部迴圈

        print("#", end="")

    print()  # 換行

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

for i in range(1,10):

    for j in range(1,10):

        product = i * j

        print("%d*%d=%2d   " % (i, j, product), end="")

    print()

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

a = int(input("請輸入 a 的值:"))

b = int(input("請輸入 b 的值:"))

maxno=(a+1)*(b+1)

for i in range(1,maxno):

    if(i%a==0 and i%b==0):

        break

print("%d 和 %d 的最小公倍數=%d"  % (a, b, i))  

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

total = i = 1

n = int(input("請輸入正整數 n 的值:"))

while(i<=n):

    total *= i  

    i+=1      

print("%d!=%d" % (n, total))

2022年3月16日 星期三

a020陣列應用_身分證檢驗

 

a020陣列應用_身分證檢驗

020: 身分證檢驗 我國的身分證字號有底下這樣的規則,因此對於任意輸入的身分證字號可以有一些基本的判斷原則,請您來判斷一個身分證字號是否是正常的號碼(不代表確有此號、此人)。

(1) 英文代號以下表轉換成數字

  A=10 台北市     J=18 新竹縣     S=26 高雄縣
  B=11 台中市     K=19 苗栗縣     T=27 屏東縣
  C=12 基隆市     L=20 台中縣     U=28 花蓮縣
  D=13 台南市     M=21 南投縣     V=29 台東縣
  E=14 高雄市     N=22 彰化縣     W=32 金門縣
  F=15 台北縣     O=35 新竹市     X=30 澎湖縣
  G=16 宜蘭縣     P=23 雲林縣     Y=31 陽明山
  H=17 桃園縣     Q=24 嘉義縣     Z=33 連江縣
  I=34 嘉義市     R=25 台南縣

(2) 英文轉成的數字, 個位數乘9再加上十位數的數字

(3) 各數字從右到左依次乘1、2、3、4....8

(4) 求出(2),(3) 及最後一碼的和

(5) (4)除10 若整除,則為 real,否則為 fake

例: T112663836

2 + 79 + 18 + 17 + 26 + 65 + 64 + 33 + 82 + 3*1 + 6 = 180

除以 10 整除,因此為 real




#--------------程式--------------

a=[10,11,12,13,14,15,16,17,34,18,19,20,21,22,35,23,24,25,26,27,28,29,32,30,31,33]
str="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for i in range(26):print(a[ord(str[i])-65],",",end="")
print()
for i in range(26): printord(str[i])-65,",",end="" )



#--------------程式--------------

a=[10,11,12,13,14,15,16,17,34,18,19,20,21,22,35,23,24,25,26,27,28,29,32,30,31,33]
# str="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
# for i in range(26):print(a[ord(str[i])-65],",",end="")
  
ID=input()  # T112663836 = 240
#ID="T112663836"
x=a[ord(ID[0])-65]    # int x= "T"=27
total = int(x/10) + (x%10)*9
total += int(ID[1])*8 + int(ID[2])*7 + int(ID[3])*6 + int(ID[4])*5 + int(ID[5])*4 + int(ID[6])*3 + int(ID[7])*2 + int(ID[8])*1 + int(ID[9])
if( total%10 == 0): 
  print("real")
else
  print("fake")


2022年3月10日 星期四

 // pin 7 6 5 4 3 2 1 Arduino PORTB dig output

// to
// A B C D E F G
// 7S pin 11 7 4 2 1 10 5
//
// 7 seg dig1--pin 12 --> Arduino pin 8 7-seg ping 上面 pin 12~ pin 7
// 7 seg dig2--pin 9 --> Arduino pin 9 下面 pin 1 ~ pin 6
// 7 seg dig3--pin 8 --> Arduino pin 10
// 7 seg dig4--pin 6 --> Arduino pin 11
const byte tt=3 ;
//byte num[10]={B11111100,B1100000,B11011010,B11110010,B01100110,B10110110,B10111110,B11100000,B11111110,B11110110} ;
//byte num[10]={B00000010,B10011111,B00100101,B00001101,B10011001,B01001001,B01000001,B00011111,B00000001,B00001001} ;
byte num[10]={B00000110,B10011111,B00100101,B00001101,B10011001,B01001001,B01000001,B00011111,B00000001,B00001001} ;
//byte num[10]={B10000000,B01000000,B00100000,B00010000,B00001000,B00000100,B00000010,B00000001} ;
int count=0 ;
void setup() {
DDRB = B001111 ; // set pin 8~11 OUTPUT for 共陰極 LOW
DDRD = B11111110 ; // set pin 1~7 OUTPUT
}
void loop() {
for( int j=0 ; j<100 ; j++) { //***顯示用,固定畫面,不然會閃動***
PORTB=B0001 ; PORTD=num[count/1000] ; delay(tt) ;
PORTB=B0010 ; PORTD=num[count/100-count/1000] ; delay(tt) ;
PORTB=B0100 ; PORTD=num[count/10-count/100] ; delay(tt) ;
PORTB=B1000 ; PORTD=num[count%10] ; delay(tt) ; }
count++ ;
}
未提供相片說明。
學明、郭書欽和其他 1 人

2022年2月22日 星期二

條件判斷 a003: 兩光法師占卜 a006: 一元二次方程式

 a003: 兩光法師占卜術

兩光法師時常替人占卜,由於他算得又快有便宜,因此生意源源不絕,時常大排長龍,他想算 得更快一點,因此找了你這位電腦高手幫他用電腦來加快算命的速度。

  他的占卜規則很簡單,規則是這樣的,輸入一個日期,然後依照下面的公式:

M=月
D=日
S=(M*2+D)%3

得到 S 的值,再依照 S 的值從 0 到 2 分別給與 普通、吉、大吉 等三種不同的運勢


str1 = input()
a = str1.split(" ")
m = int( a[0] ) 
d = int( a[1] )
fate = (m*2 + d) % 3
if(fate==0): print("普通")
if(fate==1): print("吉")
if(fate==2): print("大吉")


a006: 一元二次方程式
求一元二次方程式 ax2+bx+c=0 的根
每組輸入共一行,內含三個整數 a, b, c 以空白隔開。

Two different roots x1=?? , x2=??

Two same roots x=??

No real root

PS: 答案均為整數,若有兩個根則大者在前



# 求一元二次方程式 ax2+bx+c=0 的根
# 每組輸入共一行,內含三個整數 a, b, c 以空白隔開。
# Output ...
# Two different roots x1=?? , x2=??
# Two same roots x=??
# No real root
# PS: 答案均為整數,若有兩個根則大者在前

import math 
str = input().split()
a = int( str[0] )
b = int( str[1] )
c = int( str[2] )

D=b*b-4*a*c  

if(D==0):
   if( b == 0 ) :
     print("Two same roots x=0 ")
   else :
    print("Two same roots x=%d" % int(-b/a/2))
elif (D>0):
    print("Two different roots ",end="")
    print("x1=%d" % int( (-b + math.sqrt(D))/(2*a)) , end="" )
    print(" , x2=%d" % int((-b - math.sqrt(D))/(2*a))   ) 
else:
  print("No real root")
  #print("共軛複數")
  #print("x1=",-b/2/a,"+",(math.sqrt(-D)/2/a),"i")
  #print("x2=",-b/2/a,"-",(math.sqrt(-D)/2/a),"i")

Python + Zerojudge : a002: 簡易加法 : input/split

 a002: 簡易加法

請寫一個程式,讀入兩個數字,並求出它們的和。

輸入說明

每組輸入共一行,內含有兩個整數 a, b,以空白隔開,a, b絕對值皆小於 106


使用到的指令

1. str = input()    ---> 輸入字串  "10 20" ,中間空白

2. 串列=字串.split(間隔字元)

3.串列 a : 含有兩個元數 a[0] , a[1]

4. int() 字串轉成整數



str1 = input()
a = str1.split(" ")
inta0 = int( a[0] ) 
inta1 = int( a[1] )
print( inta0 + inta1 )