module EasyMakeMINI author 'Ali Nouri' version 1 0 choices motor MOTOR1 MOTOR2 MOTOR3 choices rgbLEDs RGB1 RGB2 choices ports PORT1 PORT2 PORT3 PORT4 choices beats '1' '1/2' '1/4' '1/8' '1/16' '2' '4' choices motorDir 'Clock-Wise' 'Counter-Clock-Wise' description 'EasyMakeMINI Library HW Rev 1.0 This library controls these components: - Button - Buzzer - RGB LED - Motor Use separate librares to control: - Servo - Graphic display (OLED) See https://easy-iot.io/, https://easy-iot.io/docs/ ' variables _ezMk_initialized _ezMk_pixels _imgData _byteCount _ezMk_irSensorValues _ezMk_irSensorThresh _ezMk_irSensor_calMax _ezMk_irSensor_calMin spec 'r' 'ezMk_button1' 'EasyMakeMINI button1 pressed' spec 'r' 'ezMk_button2' 'EasyMakeMINI button2 pressed' spec ' ' 'ezMk_beep' 'EasyMakeMINI beep _ ms' 'auto' 500 spec 'r' 'ezMk_buzzer_pin' 'EasyMakeMINI buzzer pin' spec 'r' 'ezMk_servo1_pin' 'EasyMakeMINI servo1 pin' spec 'r' 'ezMk_servo2_pin' 'EasyMakeMINI servo2 pin' spec 'r' 'ezMk_random_color' 'EasyMakeMINI random color' spec 'r' 'ezMk_rgb_color' 'EasyMakeMINI color r _ g _ b _ (0-255)' 'auto auto auto' 0 0 0 spec ' ' 'ezMk_set_rgb_color' 'EasyMakeMINI set RGB LED _ color _' 'str.rgbLEDs color' 'RGB1' spec ' ' 'ezMk_turn_off_RGB' 'EasyMakeMINI turn off RGB LED _' 'str.rgbLEDs' 'RGB1' spec ' ' 'ezMk_set_motor_dir_speed' 'EasyMakeMINI set _ _ speed _ (0,100)%' 'menu.motor menu.motorDir num' 'MOTOR1' 'Clock-Wise' 100 spec ' ' 'ezMk_set_motor_power' 'EasyMakeMINI set _ power _ (-100,100)%' 'menu.motor num' 'MOTOR1' 100 spec ' ' 'ezMk_stop_motor' 'EasyMakeMINI _ break _' 'menu.motor bool' 'MOTOR1' false spec 'r' 'ezMk_ultrasonic' 'EasyMakeMINI ultrasonic _ distance (cm)' 'menu.ports' 'PORT1' spec 'r' 'ezMk_beat' '_ beat' 'str.beats' '1' spec 'r' 'ezMk_image' 'EasyMakeMINI image _' 'microbitDisplay' 4540074 spec 'r' 'eziot_logo' 'Easy IoT Logo' spec 'r' '_ezMk_grove_p1_pin' '_ P1 pin' 'menu.ports' 'PORT1' spec 'r' '_ezMk_grove_p2_pin' '_ P2 pin' 'menu.ports' 'PORT1' to '_ezMk_grove_p1_pin' conn { if (conn == 'PORT1') { return 26 } (conn == 'PORT2') { return 26 } (conn == 'PORT3') { return 25 } (conn == 'PORT4') { return 25 } else { sayIt 'Invalid Grove connector!' stopTask } } to '_ezMk_grove_p2_pin' conn { if (conn == 'PORT1') { return 36 } (conn == 'PORT2') { return 39 } (conn == 'PORT3') { return 34 } (conn == 'PORT4') { return 35 } else { sayIt 'Invalid Grove connector!' stopTask } } to ezMk_ultrasonic port { return ('distance (cm)' ('_ezMk_grove_p1_pin' port) ('_ezMk_grove_p2_pin' port)) } to '_ezMk_init_pins' { if _ezMk_initialized {return} _ezMk_pixels = (newList 2) fillList _ezMk_pixels 0 '[display:neoPixelSetPin]' 27 false _ezMk_initialized = (booleanConstant true) } to ezMk_beat beat { if (beat == '1') { return 250 } (beat == '2') { return 500 } (beat == '4') { return 1000 } (beat == '1/2') { return 125 } (beat == '1/4') { return 63 } (beat == '1/8') { return 31 } (beat == '1/16') { return 15 } else { return 1000 } } to ezMk_beep duration { local 'end time' ((millisOp) + duration) repeatUntil ((millisOp) >= (v 'end time')) { digitalWriteOp 14 true waitMicros 700 digitalWriteOp 14 false waitMicros 700 } } to ezMk_button1 { return (not (digitalReadOp 5 true)) } to ezMk_button2 { return (not (digitalReadOp 15 true)) } to ezMk_buzzer_pin { return 14 } to ezMk_image spr# { '_initCheck' local 'spriteList' ('[data:newByteArray]' 200) for col 5 { for row ('[data:asByteArray]' ('[data:makeList]' 0 5 10 15 20)) { local 'bit' (col + row) local 'vertBit#' (bit / 5) if ((spr# & (1 << (bit - 1))) != 0) { atPut (((row / 5) * 40) + ((col * 8) - 6)) spriteList 126 atPut (((row / 5) * 40) + ((col * 8) - 5)) spriteList 126 atPut (((row / 5) * 40) + ((col * 8) - 4)) spriteList 126 atPut (((row / 5) * 40) + ((col * 8) - 3)) spriteList 126 atPut (((row / 5) * 40) + ((col * 8) - 2)) spriteList 126 atPut (((row / 5) * 40) + ((col * 8) - 1)) spriteList 126 } } } _imgWidth = 40 _imgHeight = 40 return spriteList } to ezMk_random_color { local 'n1' (random 100 200) local 'n2' (random 0 100) if (1 == (random 1 3)) { return ((n1 << 16) | (n2 << 8)) } (1 == (random 1 2)) { return ((n2 << 16) | n1) } else { return ((n1 << 8) | n2) } } to ezMk_rgb_color r g b { r = (maximum 0 (minimum r 255)) g = (maximum 0 (minimum g 255)) b = (maximum 0 (minimum b 255)) return (((r << 16) | (g << 8)) | b) } to ezMk_servo1_pin { return 18 } to ezMk_servo2_pin { return 19 } to ezMk_set_motor_dir_speed motor dir speed { speed = (maximum 0 (minimum speed 100)) if (motor == 'MOTOR1') { if (dir == 'Clock-Wise') { analogWriteOp 13 ((1023 * speed) / 100) analogWriteOp 12 0 } (dir == 'Counter-Clock-Wise') { analogWriteOp 13 0 analogWriteOp 12 ((1023 * speed) / 100) } } (motor == 'MOTOR2') { if (dir == 'Clock-Wise') { analogWriteOp 23 ((1023 * speed) / 100) analogWriteOp 4 0 } (dir == 'Counter-Clock-Wise') { analogWriteOp 23 0 analogWriteOp 4 ((1023 * speed) / 100) } } else { if (dir == 'Clock-Wise') { analogWriteOp 33 ((1023 * speed) / 100) analogWriteOp 32 0 } (dir == 'Counter-Clock-Wise') { analogWriteOp 33 0 analogWriteOp 32 ((1023 * speed) / 100) } } } to ezMk_set_motor_power motor power { power = (maximum -100 (minimum power 100)) if (motor == 'MOTOR1') { if (0 < power) { analogWriteOp 13 ((1023 * (absoluteValue power)) / 100) analogWriteOp 12 0 } else { analogWriteOp 13 0 analogWriteOp 12 ((1023 * (absoluteValue power)) / 100) } } (motor == 'MOTOR2') { if (0 < power) { analogWriteOp 23 ((1023 * (absoluteValue power)) / 100) analogWriteOp 4 0 } else { analogWriteOp 23 0 analogWriteOp 4 ((1023 * (absoluteValue power)) / 100) } } else { if (0 < power) { analogWriteOp 33 ((1023 * (absoluteValue power)) / 100) analogWriteOp 32 0 } else { analogWriteOp 33 0 analogWriteOp 32 ((1023 * (absoluteValue power)) / 100) } } } to ezMk_set_rgb_color LED color { '_ezMk_init_pins' if (LED == 'RGB1') { atPut 1 _ezMk_pixels color } (LED == 'RGB2') { atPut 2 _ezMk_pixels color } '[display:neoPixelSend]' _ezMk_pixels waitMicros 500 } to ezMk_stop_motor motor active { if (motor == 'MOTOR1') { if active { analogWriteOp 13 1023 analogWriteOp 12 1023 } else { analogWriteOp 13 0 analogWriteOp 12 0 } } (motor == 'MOTOR2') { if active { analogWriteOp 23 1023 analogWriteOp 4 1023 } else { analogWriteOp 23 0 analogWriteOp 4 0 } } else { if active { analogWriteOp 33 1023 analogWriteOp 32 1023 } else { analogWriteOp 33 0 analogWriteOp 32 0 } } } to ezMk_turn_off_RGB LED { '_ezMk_init_pins' if (LED == 'RGB1') { atPut 1 _ezMk_pixels 0 } (LED == 'RGB2') { atPut 2 _ezMk_pixels 0 } '[display:neoPixelSend]' _ezMk_pixels waitMicros 500 } to eziot_logo { comment 'Generates easy iot logo image' _imgData = 0 _imgWidth = 128 _imgHeight = 20 _byteCount = 0 local '_imgHex' '801400000000c0e0f0f8f87c3c3c3c3c3c3c3c3c3c3c3c3c04203c3c3c3c3c3c3c3c3c3c3cfcfcfcfcf8f000c0f0f8f8fc7c3c3c3c3c3c3c3c3c3c30043cfcfcfcfce08080c0e0f0f0f87c3c1c0c0c0400000000e0fcfcfcfc3c04c0e0f0f0f8f87c3c3c3c3c3c3c3c3cfcfcfcf8f8e40c3c3cbcfcfcfcfcfc3c3c3c3c3c3c0400000000fcffffffffcfcfcfcfcfcfcfcfcfcfcf4f07e0f8fcfefeffcfc7c7c7c7c7c7e7ffffffff3f07c0c0c3c7c7c7c7c7c7c7c7c7c7efffffff7e3e0000e3ffffffff7f0f0703010000000000000000c0f8ffffff7f0f0178ffffffffffc1c0c0c0c0c0c0c0e0f0f8ffff7f1f0f0100e0fcffffff3f07000000000000000000000000000103030303030303030303030303010000000103030303030303030303030303030301000303030303030303030303030303030101000000000303030303010000000000000000000000000303030303010000000000010103030303030303030303010101000000000000030303030301000000000000000000000000' '_process image data' _imgHex _imgHex = '' return _imgData }