2016-08-26 5 views
2

내 BBC 마이크로 비트를 디지털 시계, 특히 2 진 디지털 시계로 변환하는 것이 재미있는 아이디어라고 생각했습니다. 나는 파이썬에서 약간의 코드를 작성하여이를 수행했다.마이크로 비트에서 10 진수를 2 진수로 변환

from microbit import * 

def makeBinary(intValue,padding): 
    number = intValue 
    returnValue = "" 
    brightness = 4 #value 0 to 8 
    while number > 0: 
     bit = number % 2 
     if bit > 0: 
      bit = brightness 
     quotient = number/2 
     returnValue = str(bit)+returnValue 
     number = quotient 
    for i in range(len(returnValue),padding): 
     returnValue = "0"+returnValue 
    return returnValue 

timeAdvance = 0 
minuteAdvance = 0 
hourAdvance = 0 
secondCounter = 0 
while True: 
    if button_a.was_pressed(): 
     #advance hours 
     hourAdvance = hourAdvance + 1 
     if hourAdvance > 23: 
      hourAdvance = 0 
     timeAdvance = (hourAdvance*60*60*1000)+(minuteAdvance*60*1000) 
    elif button_b.was_pressed(): 
     #advance minutes 
     minuteAdvance = minuteAdvance + 1 
     if minuteAdvance > 59: 
      minuteAdvance = 0 
     timeAdvance = (hourAdvance*60*60*1000)+(minuteAdvance*60*1000) 
    else: 
     #calculate and display time 
     if (running_time()-secondCounter) > 1000: 
      secondCounter = running_time() 
      seconds = (running_time()/1000)%60 
      minutes = ((running_time()+timeAdvance)/1000/60)%60 
      hours = ((running_time()+timeAdvance)/1000/60/60)%24 
      pmString = "0" 
      addthirtyMString = "00000" 
      addthirtySString = "00000" 
      if hours>12: 
       pmString = "9" 
       hours = hours - 12 
      if minutes>29: 
       addthirtyMString = "00900" 
       minutes = minutes - 30 
      if seconds>29: 
       addthirtySString = "00900" 
       seconds = seconds - 30 
      hourString = makeBinary(hours,4) 
      minuteString = makeBinary(minutes,5) 
      secondString = makeBinary(seconds,5) 
      time = Image(pmString+hourString+":"+minuteString+":"+addthirtyMString+":"+secondString+":"+addthirtySString) 
      display.show(time) 

문제는 작동하지 않는다는 것이다. 모든 일을 반환 이진 필드에 Microbit 결과에 실행 수는 0 그래서 오전 10시 48분 1초는 (잘못)입니다

**** 
***** 

***** 

로 표시 그것은

* * 
* * 
    * 
    * 

로 표시해야하지 않는 한 am/pm led가 추가되고 30 초 추가/30 분 마커 추가가 잘 수행되면이 값은 십진수의 이진 표현 (makeBinary 함수)을 형식화하는 것과 관련된 명확한 문제입니다. 처음에 '형식'을 사용하여이 작업을 시도했지만 마이크로 파이썬에서 마이크로 파이썬은 분명히 그것을 좋아하지 않습니다.

내 '실제'컴퓨터에서 makeBinary을 실행하면 정상적으로 작동합니다. 누구가 여기에서 어쩌면일지도 모른 무슨 아이디어가 있는가? 또는 MicroBit을 혼동시킬 수있는 함수를 사용하지 않고 10 진수를 2 진 문자열로 변환하는 다른 간단한 방법에 대한 제안 사항이 있습니까?

답변

2

마이크로 비트는 마이크로 파이썬을 위해 파이썬 3을 사용합니다. 즉, 두 정수의 나눗셈은 종종 정수가 아닌 부동 소수점 값을 반환합니다. 명시 적으로 정수 나누기를 원하는 경우에 당신은 요약 (파이썬 2와 함께 작동합니다 어떤) //을 사용한다 : 시간 이후

  Py 2   Py 3 and microbit 
35/10  3    3.5 
35 // 10 3    3 
35.0/10 3.5    3.5 

는 int를 기대 make_binary() 기능을, 혼란, 부동 소수점으로 나오고있다.

 quotient = number // 2 

[...]

 seconds = (running_time()//1000)%60 
     minutes = ((running_time()+timeAdvance)//60000)%60 
     hours = ((running_time()+timeAdvance)//3600000)%24 

는 분할되는 제 문제를 해결해야한다.

컴퓨터에 python 3을 설치하여 사용하는 경우 디버그하는 것이 더 쉽습니다.

자, 파이썬은 이미 문자열

>>> bin(58) 
'0b111010' 

으로 바이너리 표현을 정수를 취하고 반환하는 bin() 기능을 가지고 있으며, 여러분의 코드는이를 사용하는 대신에 자신을 작성해야합니다.

+0

이 James에게 감사드립니다. 정수/부동 응답이 청구서에 완벽하게 맞습니다! 사실, 나는 bin을 시도했다 - 그러나 Microbit는 0b의 자르기와 필요한 길이의 padding에서 wobbler를 던졌다. (아마 Python 3에서의 형식에 대한 내 자신의 오해 때문에?) 아무리해도! 이제는 모두 작동합니다. – headbanger