Compare commits

..

150 Commits

Author SHA1 Message Date
fbf7513c44 0.3.1 2016-07-26 13:03:23 +01:00
e9bdc26d15 Bump to 0.3 2016-07-26 13:03:15 +01:00
52fafe9359 0.2.188 2016-07-26 12:59:11 +01:00
971dca6c96 0.2.187 2016-07-26 12:58:47 +01:00
a761c27b19 Bump pxt-core to 0.3.1 2016-07-26 12:58:47 +01:00
a062a85c7f Merge branch 'master' of github.com:Microsoft/pxt-microbit 2016-07-26 12:46:24 +01:00
a9865a731a Moved to separate repos 2016-07-26 12:41:30 +01:00
ba4095ac9c fix problem with semis 2016-07-26 00:45:39 -04:00
8606a00701 remove link to pxt 2016-07-26 00:37:14 -04:00
bf57ba2902 link to PXT 2016-07-25 20:05:27 -04:00
4cd61cd96a delete lang.md 2016-07-25 17:01:37 -04:00
c4139a862f some doc fixes 2016-07-25 17:00:51 -04:00
ca3cd1de22 Merge branch 'master' of https://github.com/Microsoft/pxt-microbit
# Conflicts:
#	package.json
2016-07-25 16:53:33 -04:00
d7f22bc8e6 fix broken link 2016-07-25 11:33:14 -07:00
12754acc54 Merge branch 'master' of https://github.com/Microsoft/pxt-microbit 2016-07-22 15:14:50 -07:00
329baaf9a4 0.2.192 2016-07-22 17:07:29 +01:00
47efcfb41f Bump pxt-core to 0.2.202 2016-07-22 17:07:29 +01:00
e2d1b8a55c Run tests 2016-07-22 17:06:56 +01:00
579eb29ce3 0.2.191 2016-07-22 15:22:50 +01:00
ada9560642 Bump pxt-core to 0.2.201 2016-07-22 15:22:49 +01:00
7b352b3a58 Use pre-cached TD scripts for testing 2016-07-22 15:21:16 +01:00
a5d5836ea2 Add some tests converted from TD 2016-07-22 15:18:38 +01:00
57dc26a127 Merge branch 'master' of https://github.com/Microsoft/pxt-microbit 2016-07-22 07:15:57 -07:00
3e37b03808 0.2.190 2016-07-22 12:26:13 +01:00
d035713786 Bump pxt-core to 0.2.200 2016-07-22 12:26:13 +01:00
6e4a71b2f4 0.2.189 2016-07-22 12:12:21 +01:00
0b4dd534ab Bump pxt-core to 0.2.199 2016-07-22 12:12:20 +01:00
ed07f0baad 0.2.188 2016-07-22 11:57:15 +01:00
004d34b5df Bump pxt-core to 0.2.197 2016-07-22 11:57:15 +01:00
aa380baf1c 0.2.187 2016-07-22 11:39:39 +01:00
5123a962d9 Bump pxt-core to 0.2.196 2016-07-22 11:39:39 +01:00
7dcd770508 Cache sources for testconv in travis 2016-07-22 11:32:57 +01:00
ead4d32446 Update analog-read-pin.md 2016-07-21 16:36:33 -07:00
a51a14022a Update analog-pitch.md 2016-07-21 16:25:20 -07:00
05098252ed slightly more impressive about example 2016-07-21 15:32:59 -07:00
8e74965964 remove experiemental translations 2016-07-21 14:22:30 -07:00
63913c2182 updated getting-started intro 2016-07-21 13:46:22 -07:00
c55716e148 Control pages now link to Lancaster 2016-07-21 13:29:59 -07:00
dd94442555 Merge pull request #173 from gingemonster/master
fixing more help broken links
2016-07-21 11:10:55 -07:00
56f6a2fa56 Merge pull request #172 from gingemonster/patch-1
updated setPull help annotation
2016-07-21 11:10:15 -07:00
4ca9df141c Merge branch 'master' of https://github.com/Microsoft/pxt-microbit 2016-07-21 11:06:13 -07:00
a29e06abce removing dangling file 2016-07-21 11:06:02 -07:00
43e4d06fd9 Add tests (for pxt testdir) 2016-07-21 16:08:22 +01:00
3c8027425a Fix order of arguments for memset() 2016-07-21 09:54:53 +01:00
3f66870688 Getting started with Control 2016-07-20 16:25:09 -07:00
1f32a4851e Bump pxt-core to 0.2.195 2016-07-20 15:37:26 -07:00
478b1c84de Adding templates to Control directory 2016-07-20 11:31:14 -07:00
20ac14fdf6 fixing more help documentation links
set-accelerometer-range was wrong so fixing reference to help doc
2016-07-20 10:44:32 +01:00
c805d67cf6 fixing help for pins.pulseDuration
Help document at https://codethemicrobit.com/reference/pins/pulse-duration doesnt match the help annotation in the code so this fixes it
2016-07-20 06:29:44 +01:00
943c2e7716 Fixing help annotation on serial.redirect
Code currently points to help at https://codethemicrobit.com/reference/serial/redirect but the working url is https://codethemicrobit.com/reference/serial/redirect-to so fixed the help annotation
2016-07-20 06:21:15 +01:00
298a37e576 updated setPull help annotation
At some point Im guessing the help file has been renamed and its current url is https://codethemicrobit.com/reference/pins/set-pull. This change to the annotation of setPull removes the word "digital" so that the link should work again
2016-07-20 06:14:18 +01:00
327d52014c Misnamed, redundant file 2016-07-19 16:02:31 -07:00
6a5cfae5ff snake_case -> camelCase in docs 2016-07-19 11:42:42 +01:00
64ebb5c8c3 Correct assignment blocks in docs
Previously these blocks were not rendering.
2016-07-19 11:26:41 +01:00
bb97b57b01 Correct typo in string documentation
Note that currently you can't follow through with these instructions because string literals aren't supported, and there isn't support for converting the JS in this doc.
2016-07-19 09:25:48 +01:00
534e3723d2 Finishing fixing parameters 2016-07-18 15:51:28 -07:00
ad6ef04b1f Fixing parameters 2016-07-18 15:18:40 -07:00
2c09b7794f Fixing parameters 2016-07-18 14:23:05 -07:00
4941ce1694 Fixing parameters 2016-07-18 14:04:15 -07:00
aa6a965f59 Fixing parameters 2016-07-18 11:14:51 -07:00
1831c30050 Fixing parameters 2016-07-18 10:39:41 -07:00
df5989760c Make serial docs clearer, resolve issue #158 2016-07-18 17:17:16 +01:00
6a7f65894c Added missing parameters sections 2016-07-15 16:43:26 -07:00
f56e9369dd Fixed some parameter names 2016-07-15 14:53:52 -07:00
e23c5e019f Fix param names 2016-07-15 14:12:10 -07:00
1aa08f63fe Another new Game topic and more fixes 2016-07-15 11:54:22 -07:00
8ef94d2854 update docs 2016-07-15 11:47:37 -07:00
797474063d New Game topic, some fixes 2016-07-15 10:24:16 -07:00
b76622542b Ensure title shows correctly for doc pages 2016-07-15 15:50:26 +01:00
6a1415b3e1 Default indentation for default project.
The editor lints the TS file every time it launches, might as well commit the change.
2016-07-15 15:39:16 +01:00
2d09aef287 Merge pull request #164 from thomasdenney/master
Fixed '@params' in Neopixel blocks' docs and 'about about'
2016-07-15 08:47:59 +01:00
3ce1fa9b6e New Game topic 2016-07-14 16:58:08 -07:00
155bbb25f7 New Game topic 2016-07-14 12:49:19 -07:00
5fb3da5a77 New Game topic 2016-07-14 12:47:33 -07:00
5b682cd8d9 some mods to the docs 2016-07-14 12:09:40 -07:00
4755f0953c update ignore file 2016-07-14 12:04:06 -07:00
bdcd299805 New Serial topic 2016-07-13 16:24:56 -07:00
3e23fe4814 New Game topic, some fixes 2016-07-13 15:04:10 -07:00
3782d26e64 New Game topic 2016-07-13 13:10:06 -07:00
84a29eec65 Merge remote-tracking branch 'upstream/master' 2016-07-13 09:17:32 +01:00
299efaf0f2 Merge branch 'master' of github.com:Microsoft/pxt-microbit 2016-07-12 18:34:32 +02:00
33c60b467b Add ignore file for ptrcheck 2016-07-12 18:34:21 +02:00
81f74f07b2 Fix typo, resolve issue #165 2016-07-12 09:46:46 +01:00
583b08df28 Wrote new Serial topic 2016-07-11 12:54:28 -07:00
01f80b67bc Fix parameters 2016-07-11 11:13:13 -07:00
a890d2a357 Wrote new Serial topic 2016-07-11 10:58:16 -07:00
0d1b91afc3 0.2.186 2016-07-11 17:10:00 +02:00
5c0d37d718 Bump pxt-core to 0.2.194 2016-07-11 17:10:00 +02:00
c81e56613e Mark microbit DAL config as just defaults 2016-07-11 14:29:49 +02:00
4cc7215d35 Updated Linux (and Windows) instructions 2016-07-08 16:34:56 -07:00
8751d2aaa1 Rewrote one Serial topic; shifted some material 2016-07-08 15:29:14 -07:00
af91622dda Wrote new Serial topic 2016-07-08 12:45:31 -07:00
45d4caf595 Rewrote/expanded serial topic 2016-07-08 11:46:51 -07:00
a8e1d2a86c Fixed '@params' in Neopixel blocks' docs 2016-07-08 14:30:45 +01:00
5099b11823 remove hint 2016-07-06 20:37:43 -07:00
37e0307698 Wrote two new Game topics 2016-07-06 15:19:43 -07:00
1b15eefa5a Wrote new Game topic 2016-07-06 13:31:42 -07:00
a4eccaf4f9 Wrote new advanced topic 2016-07-06 11:54:42 -07:00
5981863e3f more intellisense 2016-07-05 17:35:37 -07:00
9ac7a4c522 Wrote new advanced topic 2016-07-05 16:36:09 -07:00
9f1c3ee13c Created advanced topic 2016-07-05 14:04:12 -07:00
8b9c3d71d5 Wrote new I2C topic. 2016-07-05 12:40:04 -07:00
6d726b7499 Wrote new I2C topic. 2016-07-05 12:30:28 -07:00
b5da5afd1d 0.2.185 2016-07-03 15:57:20 -07:00
420898e98c fix links in cards 2016-07-03 15:56:13 -07:00
f6b392356c 0.2.184 2016-07-02 19:05:57 -04:00
f4896f8d7c update doc 2016-07-02 18:55:00 -04:00
4dbd691146 update docs 2016-07-02 18:27:58 -04:00
2742dba0c4 update 2016-07-02 18:27:49 -04:00
5bea47a094 more on js 2016-07-02 10:18:45 -04:00
835a4b5cf0 Edited advanced topic. 2016-07-01 13:03:53 -07:00
055704b3ef 0.2.183 2016-07-01 15:16:43 +01:00
60107aa7ce Bump pxt-core to 0.2.193 2016-07-01 15:16:43 +01:00
787ab021a7 0.2.182 2016-07-01 15:03:49 +01:00
f56a70f502 Bump pxt-core to 0.2.192 2016-07-01 15:03:48 +01:00
4ec6749ee6 Merge branch 'master' of github.com:Microsoft/pxt-microbit 2016-07-01 14:46:14 +01:00
8413b61397 Format code 2016-07-01 14:46:05 +01:00
ecbb970983 Add target-specific meta headers for social media 2016-07-01 09:26:54 +01:00
36e6570296 Edited advanced topic 2016-06-30 12:43:42 -07:00
92c63b615a Edited advanced topic. 2016-06-30 11:53:13 -07:00
f71267c988 Edited and expanded advanced topic. 2016-06-30 11:02:28 -07:00
38fc0f8099 Fix typo preventing docs upload 2016-06-30 18:10:15 +01:00
8c7238eab3 0.2.181 2016-06-30 16:36:17 +01:00
2baca30184 Bump pxt-core to 0.2.191 2016-06-30 16:36:17 +01:00
ac56979142 Merge branch 'master' of github.com:Microsoft/pxt-microbit 2016-06-30 16:36:13 +01:00
ff72858c42 Use new index.html includes/overrides 2016-06-30 16:36:07 +01:00
deac587164 Rewrote in simple language. Added hint about average values. 2016-06-29 13:10:45 -07:00
7a0a2fbd0a Rewrote in simple language. Added hint about averaging read values. 2016-06-29 12:41:35 -07:00
79c32097b5 Merge branch 'master' of github.com:Microsoft/pxt-microbit 2016-06-29 17:49:02 +01:00
26c20d9fc3 Set twitter card logo 2016-06-29 17:48:40 +01:00
fe826a508a start on doc for javascript 2016-06-28 13:35:40 -04:00
62d2140d24 Merge pull request #152 from bluetooth-mdw/master
Reordered links in See Also sections
2016-06-28 13:34:48 -04:00
499d619faf Reordered links in 'See also' sections 2016-06-27 13:54:44 +01:00
c178e58260 Added About Bluetooth page and links to profile reference and overview 2016-06-27 13:46:29 +01:00
d242501fe6 better aspect ratio 2016-06-25 20:21:33 -04:00
37a438735d add Next buttons to projects 2016-06-25 17:23:00 -04:00
b862cfc4ec Format code 2016-06-25 19:40:21 +01:00
31002ae1a8 Fix typo in onPulse; hook up createBuffer 2016-06-25 19:17:43 +01:00
e8a3a2f676 Merge branch 'master' of github.com:Microsoft/pxt-microbit 2016-06-25 15:22:12 +01:00
e6baf8c35e bring streaming into menu 2016-06-24 19:37:05 -04:00
b72ff9fe4f New page for accelerometer range. 2016-06-24 15:42:21 -07:00
58f79ea617 0.2.180 2016-06-24 13:54:47 -07:00
ed6d343992 Bump pxt-core to 0.2.190 2016-06-24 13:54:45 -07:00
92b46d5c7b using button instead of large links 2016-06-24 13:27:34 -07:00
9cf7f08ae2 0.2.179 2016-06-24 11:31:22 -07:00
3b05b8f2f6 Bump pxt-core to 0.2.189 2016-06-24 11:31:20 -07:00
774d614d79 Merge branch 'master' of https://github.com/Microsoft/pxt-microbit 2016-06-24 11:26:51 -07:00
545f715eeb fixing uarl docs 2016-06-24 11:03:39 -07:00
45b480c6dd Rewrote in simple language. Deleted an irrelevant example. 2016-06-24 10:25:47 -07:00
8edd8ac73a Support macOS in automatic deployment 2016-06-23 23:55:36 -07:00
176 changed files with 2956 additions and 1482 deletions

3
.gitignore vendored
View File

@ -1,6 +1,7 @@
node_modules
yotta_modules
yotta_targets
pxt_modules
built
typings
tmp
@ -18,4 +19,4 @@ clients/**/obj/**
*.tgz
*.db
*.suo
*.log
*.log

View File

@ -4,8 +4,9 @@ node_js:
script:
- "node node_modules/pxt-core/built/pxt.js travis"
- "(cd libs/lang-test0; node ../../node_modules/pxt-core/built/pxt.js run)"
- "node node_modules/pxt-core/built/pxt.js testdir tests"
- "node node_modules/pxt-core/built/pxt.js uploaddoc"
- "(cd libs/hello; node ../../node_modules/pxt-core/built/pxt.js testconv ../../testconv.json)"
- "(cd libs/hello; node ../../node_modules/pxt-core/built/pxt.js testconv https://az851932.vo.msecnd.net/files/td-converter-tests-v0.json)"
sudo: false
notifications:
email:
@ -14,4 +15,5 @@ cache:
directories:
- node_modules
- built/cache
- libs/hello/built/cache

View File

@ -6,6 +6,8 @@ import * as child_process from "child_process";
let writeFileAsync: any = Promise.promisify(fs.writeFile)
let execAsync: (cmd: string, options?: { cwd?: string }) => Promise<Buffer> = Promise.promisify(child_process.exec)
let readDirAsync = Promise.promisify(fs.readdir)
export function deployCoreAsync(res: ts.pxt.CompileResult) {
return getBitDrivesAsync()
@ -37,6 +39,10 @@ function getBitDrivesAsync(): Promise<string[]> {
})
return res
})
}
else if (process.platform == "darwin") {
return readDirAsync("/Volumes")
.then(lst => lst.filter(s => /MICROBIT/.test(s)).map(s => "/Volumes/" + s + "/"))
} else {
return Promise.resolve([])
}

View File

@ -31,33 +31,33 @@ Just like Arduino, the micro:bit can be connected to and interact with sensors,
## Hardware: The Device
Learn about about the [hardware components](/device) of the micro:bit to make the most of it!
Learn about the [hardware components](/device) of the micro:bit to make the most of it!
## Programming: Blocks or JavaScript
The student can program the BBC micro:bit using [Blocks](/blocks) or [JavaScript](/javascript), via the [micro:bit APIs](/reference):
You can program the micro:bit using [Blocks](/blocks) or [JavaScript](/javascript), via the [micro:bit APIs](/reference):
```blocks
basic.showString("Hi!");
input.onButtonPressed(Button.A, () => {
basic.showString("Hi!");
})
```
## Compile and Flash: Your Program!
When a user has her code ready, she can connect her BBC micro:bit to a computer via a USB cable, so it appears as a mounted drive (named MICROBIT).
When you have your code ready, you connect your micro:bit to a computer via a USB cable, so it appears as a mounted drive (named MICROBIT).
Compilation to ARM thumb machine code from [Blocks](/blocks) or [JavaScript](/javascript) happens in the browser.
The student is prompted to save the ARM binary program to a file, which she then simply drags to the micro:bit mounted drive,
which flashes the micro:bit device with the new program.
Compilation to ARM thumb machine code from [Blocks](/blocks) or [JavaScript](/javascript) happens in the browser. You save the ARM binary
program to a file, which you then copy to the micro:bit drive, which flashes the micro:bit device with the new program.
## Simulator: Test Your Code
Before a student compiles her code for the micro:bit, she can run it using the micro:bit simulator, all within the confines of a web browser.
You can run your code using the micro:bit simulator, all within the confines of a web browser.
The simulator has support for the LED screen, buttons, as well as compass, accelerometer, and digital I/O pins.
## C++ Runtime
The [C++ BBC micro:bit runtime](http://lancaster-university.github.io/microbit-docs/), created at [Lancaster University](http://www.lancaster.ac.uk/), provides access to the hardware functions of the micro:bit,
The [C++ micro:bit runtime](http://lancaster-university.github.io/microbit-docs/), created at [Lancaster University](http://www.lancaster.ac.uk/), provides access to the hardware functions of the micro:bit,
as well as a set of helper functions (such as displaying a number/image/string on the LED screen).
The [micro:bit library](/reference) mirrors the functions of the C++ library.
@ -65,4 +65,4 @@ When code is compiled to ARM machine code, the calls to JavaScript micro:bit fun
## Open Source
The editor for the BBC micro:bit is [open source](/open-source) on GitHub. Contributors are welcome!
The code for the micro:bit is [open source](/open-source) on GitHub. Contributors are welcome!

View File

@ -1,4 +1,4 @@
## Variables
# Variables
[Assign](/blocks/variables/assign) (set) a variable's value

View File

@ -1,6 +1,6 @@
# Device
All the bits and pieces that make up your BBC micro:bit
All the bits and pieces that make up the BBC micro:bit
![](/static/mb/device-0.png)
@ -77,7 +77,7 @@ You can attach an external device such as a motor to these and power it using th
### Serial Communication
The BBC micro:bit can send an receive data via [serial communication](/device/serial). The serial data can be transfered via USB or BLE.
The micro:bit can send an receive data via [serial communication](/device/serial). The serial data can be transfered via USB or BLE.
### Bluetooth Low Energy (BLE) Antenna

View File

@ -29,13 +29,21 @@ Unfortunately, using the serial library requires quite a bit of a setup.
If you are using the Google Chrome browser, you can use our extension to get serial data streaming in the editor.
* Install the [Extension for BBC micro:bit](https://chrome.google.com/webstore/detail/extension-for-bbc-microbi/cihhkhnngbjlhahcfmhekmbnnjcjdbge?hl=en-US) on the Chrome Web Store.
* Restart Chrome and open the web editor.
* Restart Chrome and open the [web editor](https://codethemicrobit.com)
* The serial data will show below the simulator
### Windows
You must install a device driver (for the computer to recognize the serial interface of the micro:bit); then, you must also install a terminal emulator (which is going to connect to the micro:bit and read its output). Here's how to do it:
You must install a device driver (for the computer to recognize the
serial interface of the micro:bit); then, you must also install a
terminal emulator (which is going to connect to the micro:bit and read
its output).
* Follow instructions at https://developer.mbed.org/handbook/Windows-serial-configuration in order to install the device driver
* Follow the instructions at
https://developer.mbed.org/handbook/Windows-serial-configuration to
install the device driver.
* Instructions for installing a terminal emulator are below.
#### Windows > Tera Term
@ -66,14 +74,16 @@ If you prefer another terminal emulator (such as [PuTTY](http://www.putty.org/))
### Linux
(Untested).
* Install the program `screen` if it is not already installed.
* Plug in the micro:bit.
* Open a terminal.
* Find which device node the micro:bit was assigned to with the command `ls /dev/ttyACM*`.
* If it was `/dev/ttyACM0`, type the command `screen /dev/ttyACM0 115200`. If it was some other device node,
use that one in the command instead. **Note:** You may need root access to run `screen`
successfully. You can probably use the command `sudo` like this: `sudo screen /dev/ttyACM0 115200`.
* To exit `screen`, type `Ctrl-A` `Ctrl-D`.
* Plug in the micro:bit
* Open a terminal
* `dmesg | tail` will show you which `/dev/` node the micro:bit was assigned (e.g. `/dev/ttyUSB0`)
* Then, do: `screen /dev/ttyUSB0 115200` (install the `screen` program if you don't have it). To exit, run `Ctrl-A` `Ctrl-D`.
Alternative programs include minicom, etc.
Alternative programs include `minicom` and so on.
### Mac OS

View File

@ -1,36 +1,26 @@
# Documentation
```sim
basic.forever(() => {
basic.showString("DOCS ");
})
input.onButtonPressed(Button.A, () => {
led.stopAnimation();
basic.showLeds(`
. . . . .
. # . # .
. . . . .
# . . . #
. # # # .`);
});
input.onButtonPressed(Button.B, () => {
led.stopAnimation();
basic.showLeds(`
. # . # .
# . # . #
# . . . #
. # . # .
. . # . .`);
});
```
### Things to do
* **[getting started](/getting-started)**
* Get started with [projects](/projects)
* Browse the [micro:bit APIs](/reference)
* Learn more about the [micro:bit device](/device)
* Frequently Asked Question [faq](/faq)
* Follow up with the [release notes](/release-notes)
* **[Getting Started](/getting-started)**
* [Ten projects](/projects)
### Micro:bit reference
* [The micro:bit APIs](/reference)
* [The micro:bit device](/device)
### Language and data reference
* [Blocks language](/blocks)
* [JavaScript language](/javascript)
* [Streaming data](/streaming)
### More questions?
* [Frequently Asked Question](/faq)
* [Release notes](/release-notes)
### Developers
* Learn about [packages](/packages) (possibly using C++ or ARM thumb)
* Learn about [packages](/packages)

View File

@ -2,16 +2,13 @@
## ~avatar
Are you ready to build cool BBC micro:bit programs?
Here are some challenges for you. Arrange the blocks in the editor
to make real programs that work!
## ~
Use the **Basic** drawer in the editor (to the left)
to drag out and arrange three blocks (two `show leds` and one `forever` block)
to create this program:
Use the **Basic** drawer in the editor
to drag out and arrange three blocks to create this program:
```blocks
basic.forever(() => {
@ -39,4 +36,6 @@ screen, then a smiley again -- it never stops! (That's because of the
Click **Compile** to move your program to the BBC micro:bit!
Make sure to follow the instructions.
## [NEXT: THE SCREEN](/getting-started/screen)
### ~button /getting-started/screen
NEXT: THE SCREEN
### ~

View File

@ -76,4 +76,6 @@ your handshake to make it happen!
## ~
## [NEXT: SHAKE](/getting-started/shake)
### ~button /getting-started/shake
NEXT: SHAKE
### ~

View File

@ -73,4 +73,6 @@ input.onButtonPressed(Button.AB, () => {
Flip until your thumbs get tired!
## [NEXT: ROCK PAPER SCISSORS](/getting-started/rock-paper-scissors)
### ~button /getting-started/rock-paper-scissors
NEXT: ROCK PAPER SCISSORS
### ~

View File

@ -200,4 +200,6 @@ input.onButtonPressed(Button.B, () => {
```
Click **Compile** to move your program to the BBC micro:bit!
## [NEXT: PROJECTS!](/projects)
### ~button /projects
NEXT: PROJECTS!
### ~

View File

@ -93,4 +93,6 @@ You can find the ``show leds`` block in the **Basic** part of the editor.
#### ~
## [NEXT: BUTTONS](/getting-started/buttons)
### ~button /getting-started/buttons
NEXT: BUTTONS
### ~

View File

@ -19,4 +19,6 @@ input.onGesture(Gesture.Shake, () => {
```
Click **Compile** to move your program to the BBC micro:bit!
## [NEXT: COIN FLIPPER GAME](/getting-started/coin-flipper)
### ~button /getting-started/coin-flipper
NEXT: COIN FLIPPER GAME
### ~

View File

@ -1,75 +1,31 @@
# JavaScript
# JavaScript and TypeScript
You can write micro:bit programs in a subset of [TypeScript](https://www.typescriptlang.org), a superset of JavaScript.
Many micro:bit programs, especially at the beginner's level, are just plain JavaScript. TypeScript introduces class-based
object-oriented programming, such as:
Visit the cards below to starting programming JavaScript and TypeScript with the micro:bit:
```typescript
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
let greeter = new Greeter("world");
basic.showString(greeter.greet())
```codecard
[{
"name": "Calling",
"url": "/js/call"
},{
"name": "Sequencing",
"url": "/js/sequence"
},{
"name": "Variables",
"url": "/js/variables"
},{
"name": "Operators",
"url": "/js/operators"
},{
"name": "Statements",
"url": "/js/statements"
},{
"name": "Functions",
"url": "/js/functions"
},{
"name": "Types",
"url": "/js/types"
},{
"name": "Classes",
"url": "/js/classes"
}]
```
This site is meant for teaching programming first, and JavaScript second. For this
reason, we have stayed away from concepts that are specific to JavaScript (for
example, prototype inheritance), and instead focused on ones common to most
modern programming languages (for example, loops, lexically scoped variables,
functions, classes, lambdas).
We leverage TypeScript's [type inference](http://www.typescriptlang.org/docs/handbook/type-inference.html) so that
students need not specify types when clear from context.
## Supported language features
* top-level code in the file: "Hello world!" really is just `basic.showString("Hello world!")`
* [basic types](http://www.typescriptlang.org/docs/handbook/basic-types.html)
* [variable declarations](http://www.typescriptlang.org/docs/handbook/variable-declarations.html): `let`, `const`, and `var`
* [functions](http://www.typescriptlang.org/docs/handbook/functions.html) with lexical scoping and recursion
### User-defined types and modules
* [classes](http://www.typescriptlang.org/docs/handbook/classes.html) with fields, methods and constructors; `new` keyword
* [enums](http://www.typescriptlang.org/docs/handbook/enums.html)
* [namespaces](http://www.typescriptlang.org/docs/handbook/namespaces.html) (a form of modules)
### Control-flow constructs
* `if ... else if ... else` statements
* `while` and `do ... while` loops
* `for(;;)` loops (see below about `for ... in/of`)
* `break/continue`; also with labeled loops
* `switch` statement (on numbers only)
* `debugger` statement for breakpoints
### Expressions
* conditional operator `? :`; lazy boolean operators
* all arithmetic operators (including bitwise operators); note that in microcontroller targets
all arithmetic is performed on integers, also when simulating in the browser
* strings (with a few common methods)
* [string templates](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals) (`` `x is ${x}` ``)
* arrow functions `() => ...`
* array literals `[1, 2, 3]`
## Unsupported language features
We generally stay away from the more dynamic parts of JavaScript.
Things you may miss and we may implement:
* exceptions (`throw`, `try ... catch`, `try ... finally`)
* `for ... of` statements
* object literals `{ foo: 1, bar: "two" }`
* method-like properties (get/set accessors)
* class inheritance
If there is something you'd like to see, please file an issue at [GitHub](http://github.com/microsoft/pxt/issues).

58
docs/js/call.md Normal file
View File

@ -0,0 +1,58 @@
# Call a function
The simplest way to get started in JavaScript with your micro:bit is to
call one of the micro:bit's built-in JavaScript functions. Just like Blocks
are organized into categories/drawers, the micro:bit functions are organized by
namespaces, with names corresponding to the drawer names. The `basic` namespace
contains a number of helpful functions, such as:
```typescript
basic.showString("Hello!")
```
If you want to see all functions available in the `basic` namespace, simply type `basic`
followed by `.` and a list of all the functions will appear.
![](/static/mb/js/basicFuns.png)
This feature is known as "Intellisense". Continue typing to select one of the functions,
or click on one of the functions to select. You also narrow down the set of functions by typing, as below:
![](/static/mb/js/basicIntell.png)
You can type anything to see what Intellisense will find for you. Here's an example
of what happens when you type the word `for`:
![](/static/mb/js/forIntell.png)
## Function parameter values
You might have noticed that the call `showString` above takes one parameter value,
the string to be scrolled on the LED screen. There is a second (optional)
parameter that controls the speed of the scroll. Try this:
```typescript
basic.showString("Hello!",50)
```
Intellisense shows all the available parameters for a function.
## Left and right parentheses, please!
Whenever you want to call a function, you give the name of the function
followed by `(` and ending with `)`. Inbetween the left and right
parentheses go the function arguments. If a function has zero arguments, you still
need the parentheses in order to call the function. For example
```typescript
basic.clearScreen()
```
It's a syntax error to have a left parenthesis without the "closing" right parenthesis:
```typescript
basic.clearScreen(
```
### ~button /js/sequence
NEXT: Sequencing Commands
### ~

268
docs/js/classes.md Normal file
View File

@ -0,0 +1,268 @@
# Classes
Traditional JavaScript focuses on functions and prototype-based inheritance as the basic means of building up reusable components,
but this may feel a bit awkward to programmers more comfortable with an object-oriented approach, where classes inherit functionality
and objects are built from these classes.
Starting with ECMAScript 2015, also known as ECMAScript 6, JavaScript programmers will be able to build their applications using
this object-oriented class-based approach. TypeScript, allows you to use these techniques now, compiling them
down to JavaScript that works across all major browsers and platforms, without having to wait for the next version of JavaScript.
Let's take a look at a simple class-based example:
```ts
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
let greeter = new Greeter("world");
```
We declare a new class `Greeter`. This class has three members: a property called `greeting`, a constructor, and a method `greet`.
You'll notice that in the class when we refer to one of the members of the class we prepend `this.`.
This denotes that it's a member access.
In the last line we construct an instance of the `Greeter` class using `new`.
This calls into the constructor we defined earlier, creating a new object with the `Greeter` shape, and running the constructor to initialize it.
# Inheritance
### ~hint
### Inheritance is not supported yet for the micro:bit. Coming soon...
### ~
In TypeScript, we can use common object-oriented patterns.
Of course, one of the most fundamental patterns in class-based programming is being able to extend existing classes to create new ones using inheritance.
Let's take a look at an example:
```ts
class Animal {
name: string;
constructor(theName: string) { this.name = theName; }
move(distanceInMeters: number = 0) {
console.log(`${this.name} moved ${distanceInMeters}m.`);
}
}
class Snake extends Animal {
constructor(name: string) { super(name); }
move(distanceInMeters = 5) {
console.log("Slithering...");
super.move(distanceInMeters);
}
}
class Horse extends Animal {
constructor(name: string) { super(name); }
move(distanceInMeters = 45) {
console.log("Galloping...");
super.move(distanceInMeters);
}
}
let sam = new Snake("Sammy the Python");
let tom: Animal = new Horse("Tommy the Palomino");
sam.move();
tom.move(34);
```
This example covers quite a few of the inheritance features in TypeScript that are common to other languages.
Here we see the `extends` keywords used to create a subclass.
You can see this where `Horse` and `Snake` subclass the base class `Animal` and gain access to its features.
Derived classes that contain constructor functions must call `super()` which will execute the constructor function on the base class.
The example also shows how to override methods in the base class with methods that are specialized for the subclass.
Here both `Snake` and `Horse` create a `move` method that overrides the `move` from `Animal`, giving it functionality specific to each class.
Note that even though `tom` is declared as an `Animal`, since its value is a `Horse`, when `tom.move(34)` calls the overriding method in `Horse`:
```Text
Slithering...
Sammy the Python moved 5m.
Galloping...
Tommy the Palomino moved 34m.
```
# Public, private, and protected modifiers
## Public by default
In our examples, we've been able to freely access the members that we declared throughout our programs.
If you're familiar with classes in other languages, you may have noticed in the above examples
we haven't had to use the word `public` to accomplish this; for instance,
C# requires that each member be explicitly labeled `public` to be visible.
In TypeScript, each member is `public` by default.
You may still mark a member `public` explicitly.
We could have written the `Animal` class from the previous section in the following way:
```ts
class Animal {
public name: string;
public constructor(theName: string) { this.name = theName; }
public move(distanceInMeters: number) {
console.log(`${this.name} moved ${distanceInMeters}m.`);
}
}
```
## Understanding `private`
When a member is marked `private`, it cannot be accessed from outside of its containing class. For example:
```ts
class Animal {
private name: string;
constructor(theName: string) { this.name = theName; }
}
new Animal("Cat").name; // Error: 'name' is private;
```
TypeScript is a structural type system.
When we compare two different types, regardless of where they came from, if the types of all members are compatible, then we say the types themselves are compatible.
However, when comparing types that have `private` and `protected` members, we treat these types differently.
For two types to be considered compatible, if one of them has a `private` member,
then the other must have a `private` member that originated in the same declaration.
The same applies to `protected` members.
Let's look at an example to better see how this plays out in practice:
```ts
class Animal {
private name: string;
constructor(theName: string) { this.name = theName; }
}
class Rhino extends Animal {
constructor() { super("Rhino"); }
}
class Employee {
private name: string;
constructor(theName: string) { this.name = theName; }
}
let animal = new Animal("Goat");
let rhino = new Rhino();
let employee = new Employee("Bob");
animal = rhino;
animal = employee; // Error: 'Animal' and 'Employee' are not compatible
```
In this example, we have an `Animal` and a `Rhino`, with `Rhino` being a subclass of `Animal`.
We also have a new class `Employee` that looks identical to `Animal` in terms of shape.
We create some instances of these classes and then try to assign them to each other to see what will happen.
Because `Animal` and `Rhino` share the `private` side of their shape from the same declaration of
`private name: string` in `Animal`, they are compatible. However, this is not the case for `Employee`.
When we try to assign from an `Employee` to `Animal` we get an error that these types are not compatible.
Even though `Employee` also has a `private` member called `name`, it's not the one we declared in `Animal`.
## Understanding `protected`
The `protected` modifier acts much like the `private` modifier with the exception that members
declared `protected` can also be accessed by instances of deriving classes. For example,
```ts
class Person {
protected name: string;
constructor(name: string) { this.name = name; }
}
class Employee extends Person {
private department: string;
constructor(name: string, department: string) {
super(name);
this.department = department;
}
public getElevatorPitch() {
return `Hello, my name is ${this.name} and I work in ${this.department}.`;
}
}
let howard = new Employee("Howard", "Sales");
console.log(howard.getElevatorPitch());
console.log(howard.name); // error
```
Notice that while we can't use `name` from outside of `Person`,
we can still use it from within an instance method of `Employee` because `Employee` derives from `Person`.
A constructor may also be marked `protected`.
This means that the class cannot be instantiated outside of its containing class, but can be extended. For example,
```ts
class Person {
protected name: string;
protected constructor(theName: string) { this.name = theName; }
}
// Employee can extend Person
class Employee extends Person {
private department: string;
constructor(name: string, department: string) {
super(name);
this.department = department;
}
public getElevatorPitch() {
return `Hello, my name is ${this.name} and I work in ${this.department}.`;
}
}
let howard = new Employee("Howard", "Sales");
let john = new Person("John"); // Error: The 'Person' constructor is protected
```
# Readonly modifier
You can make properties readonly by using the `readonly` keyword.
Readonly properties must be initialized at their declaration or in the constructor.
```ts
class Octopus {
readonly name: string;
readonly numberOfLegs: number = 8;
constructor (theName: string) {
this.name = theName;
}
}
let dad = new Octopus("Man with the 8 strong legs");
dad.name = "Man with the 3-piece suit"; // error! name is readonly.
```
## Parameter properties
In our last example, we had to declare a readonly member `name` and a constructor parameter `theName` in the `Octopus` class, and we then immediately set `name` to `theName`.
This turns out to be a very common practice.
*Parameter properties* let you create and initialize a member in one place.
Here's a further revision of the previous `Octopus` class using a parameter property:
```ts
class Octopus {
readonly numberOfLegs: number = 8;
constructor(readonly name: string) {
}
}
```
Notice how we dropped `theName` altogether and just use the shortened `readonly name: string` parameter on the constructor to create and initialize the `name` member.
We've consolidated the declarations and assignment into one location.
Parameter properties are declared by prefixing a constructor parameter with an accessibility modifier or `readonly`, or both.
Using `private` for a parameter property declares and initializes a private member; likewise, the same is done for `public`, `protected`, and `readonly`.

161
docs/js/functions.md Normal file
View File

@ -0,0 +1,161 @@
# Functions
Functions are the fundamental building block of programs. Here is the simplest
way to make a function that adds two numbers:
```ts
// Named function
function add(x : number, y : number) {
return x + y;
}
basic.showNumber(add(1, 2))
```
### ~ hint
For the micro:bit, you must specify a [type](/js/types) for each function parameter.
### ~
Functions can refer to variables outside of the function body.
When they do so, they're said to `capture` these variables.
```ts
let z = 100;
function addToZ(x: number, y: number) {
return x + y + z;
}
basic.showNumber(addToZ(1, 2))
```
## Typing the function
Let's add a return type to our add function:
```ts
function add(x: number, y: number): number {
return x + y;
}
```
TypeScript can figure the return type out by looking at the return statements, so you can optionally leave this off in many cases.
# Optional and Default Parameters
In TypeScript, the number of arguments given to a function has to match the number of parameters the function expects.
```ts
function buildName(firstName: string, lastName: string) {
return firstName + " " + lastName;
}
let result1 = buildName("Bob"); // error, too few parameters
let result2 = buildName("Bob", "Adams", "Sr."); // error, too many parameters
let result3 = buildName("Bob", "Adams"); // ah, just right
```
In JavaScript, every parameter is optional, and users may leave them off as they see fit.
When they do, their value is `undefined`.
We can get this functionality in TypeScript by adding a `?` to the end of parameters we want to be optional.
For example, let's say we want the last name parameter from above to be optional:
```ts
function buildName(firstName: string, lastName?: string) {
if (lastName)
return firstName + " " + lastName;
else
return firstName;
}
let result1 = buildName("Bob"); // works correctly now
let result2 = buildName("Bob", "Adams", "Sr."); // error, too many parameters
let result3 = buildName("Bob", "Adams"); // ah, just right
```
Any optional parameters must follow required parameters.
Had we wanted to make the first name optional rather than the last name, we would need to change the order of parameters in the function, putting the first name last in the list.
In TypeScript, we can also set a value that a parameter will be assigned if the user does not provide one, or if the user passes `undefined` in its place.
These are called default-initialized parameters.
Let's take the previous example and default the last name to `"Smith"`.
```ts
function buildName(firstName: string, lastName = "Smith") {
return firstName + " " + lastName;
}
let result1 = buildName("Bob"); // works correctly now, returns "Bob Smith"
let result2 = buildName("Bob", undefined); // still works, also returns "Bob Smith"
let result3 = buildName("Bob", "Adams", "Sr."); // error, too many parameters
let result4 = buildName("Bob", "Adams"); // ah, just right
```
Default-initialized parameters that come after all required parameters are treated as optional, and just like optional parameters, can be omitted when calling their respective function.
This means optional parameters and trailing default parameters will share commonality in their types, so both
```ts
function buildName(firstName: string, lastName?: string) {
// ...
}
```
and
```ts
function buildName(firstName: string, lastName = "Smith") {
// ...
}
```
share the same type `(firstName: string, lastName?: string) => string`.
The default value of `lastName` disappears in the type, only leaving behind the fact that the parameter is optional.
Unlike plain optional parameters, default-initialized parameters don't *need* to occur after required parameters.
If a default-initialized parameter comes before a required parameter, users need to explicitly pass `undefined` to get the default initialized value.
For example, we could write our last example with only a default initializer on `firstName`:
```ts
function buildName(firstName = "Will", lastName: string) {
return firstName + " " + lastName;
}
let result1 = buildName("Bob"); // error, too few parameters
let result2 = buildName("Bob", "Adams", "Sr."); // error, too many parameters
let result3 = buildName("Bob", "Adams"); // okay and returns "Bob Adams"
let result4 = buildName(undefined, "Adams"); // okay and returns "Will Adams"
```
# Rest Parameters
Required, optional, and default parameters all have one thing in common: they talk about one parameter at a time.
Sometimes, you want to work with multiple parameters as a group, or you may not know how many parameters a function will ultimately take.
In JavaScript, you can work with the arguments directly using the `arguments` variable that is visible inside every function body.
In TypeScript, you can gather these arguments together into a variable:
```ts
function buildName(firstName: string, ...restOfName: string[]) {
return firstName + " " + restOfName.join(" ");
}
let employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");
```
*Rest parameters* are treated as a boundless number of optional parameters.
When passing arguments for a rest parameter, you can use as many as you want; you can even pass none.
The compiler will build an array of the arguments passed in with the name given after the ellipsis (`...`), allowing you to use it in your function.
The ellipsis is also used in the type of the function with rest parameters:
```ts
function buildName(firstName: string, ...restOfName: string[]) {
return firstName + " " + restOfName.join(" ");
}
let buildNameFun: (fname: string, ...rest: string[]) => string = buildName;
```
### ~button /js/types
NEXT: Types
### ~

0
docs/js/inference.md Normal file
View File

30
docs/js/operators.md Normal file
View File

@ -0,0 +1,30 @@
## Operators
The following JavaScript operators are supported for the micro:bit.
### ~hint
Note that for the micro:bit all arithmetic is performed on integers, rather than floating point.
This also is true when simulating in the browser.
### ~
# Assignment, arithmetic and bitwise
* assignment operators - [read more](http://devdocs.io/javascript/operators/assignment_operators)
* arithmetic operators - [read more](http://devdocs.io/javascript/operators/arithmetic_operators)
* bitwise operators - [read more](http://devdocs.io/javascript/operators/bitwise_operators)
# Comparision and conditional
* comparison operators - [read more](http://devdocs.io/javascript/operators/comparison_operators)
* conditional operator - [read more](http://devdocs.io/javascript/operators/conditional_operator)
## More
* lambda functions `() => { ... }`
* array literals `[1, 2, 3]`
* strings, with a few common methods
* [string templates](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals) (`` `x is ${x}` ``)
### ~button /js/statements
NEXT: Statements
### ~

63
docs/js/sequence.md Normal file
View File

@ -0,0 +1,63 @@
# Sequencing
By calling one function after another, in sequence, you can create an animation:
```typescript
basic.showLeds(`
. # . # .
. . . . .
. . # . .
# . . . #
. # # # .
`);
basic.showLeds(`
. # . # .
. . . . .
. . . . .
. # # # .
# . . . #
`);
```
### The semicolon
In JavaScript, the semicolon (;) is used to terminate (or end) a statement. However, in most
cases, the semicolon is optional and can be omitted. So both code sequences below are
legal:
```typescript
basic.showNumber(1)
basic.showNumber(2)
```
```typescript
basic.showNumber(1);
basic.showNumber(2);
```
## The empty statement
In JavaScript, there is the concept of an *empty statement*, which is whitespace followed by
a semicolon in the context where a statement is expected.
So, the following code is an infinite loop
followed by a call to `showNumber` that will never execute:
```typescript
while(true) ;
basic.showNumber(1);
```
### ~hint
For the micro:bit, we don't allow a program to contain an empty statement, such as shown above.
If you really want an empty statement, you need to use curly braces to delimit an empty statement block:
```typescript
while(true) { }
basic.showNumber(1);
```
### ~
[Read more](http://inimino.org/~inimino/blog/javascript_semicolons) about semicolons in JavaScript.
### ~button /js/variables
NEXT: Variable Declarations
### ~

33
docs/js/statements.md Normal file
View File

@ -0,0 +1,33 @@
# Statements
The following JavaScript statements are supported for the micro:bit:
## Variable declarations
* `const` statement - [read more](http://devdocs.io/javascript/statements/const)
* `let` statement - [read more](http://devdocs.io/javascript/statements/let)
* `var` statement - [read more](http://devdocs.io/javascript/statements/var)
## Block-structured statements
* `{ }` block statement - [read more](http://devdocs.io/javascript/statements/block)
* `if-else` conditional statement - [read more](http://devdocs.io/javascript/statements/if...else)
* `while` loop - [read more](http://devdocs.io/javascript/statements/do...while)
* `do-while` loop - [read more](http://devdocs.io/javascript/statements/do...while)
* `for(;;)` loop - [read more](http://devdocs.io/javascript/statements/for)
* `switch` statement (on numbers only) - [read more](http://devdocs.io/javascript/statements/switch)
## Control-flow commands
* `break` statement - [read more](http://devdocs.io/javascript/statements/break)
* `continue` statement - [read more](http://devdocs.io/javascript/statements/continue)
* `return` statement - [read more](http://devdocs.io/javascript/statements/return)
* `debugger` statement for breakpoints - [read more](http://devdocs.io/javascript/statements/debugger)
## Labelling statements
* labelled statement - [read more](http://devdocs.io/javascript/statements/label)
* `default` statement - [read more](http://devdocs.io/javascript/statements/default)
### ~button /js/functions
NEXT: Functions
### ~

140
docs/js/types.md Normal file
View File

@ -0,0 +1,140 @@
# Types
For programs to be useful, we need to be able to work with some of the simplest units of data:
numbers, strings, structures, boolean values, and the like.
# Boolean
The most basic datatype is the simple true/false value, which is called a `boolean` value.
```ts
let isDone: boolean = false;
```
# Number
### ~ hint
In JavaScript, `numbers` are floating point values.
However, for the micro:bit, `numbers` are integer values.
### ~
Integer values can be specified via decimal, hexadecimal and octal notation:
```ts
let decimal: number = 42;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;
```
# String
As in other languages, we use the type `string` to refer to textual data.
Use double quotes (`"`) or single quotes (`'`) to surround string data.
```ts
let color: string = "blue";
color = 'red';
```
You can also use *template strings*, which can span multiple lines and have embedded expressions.
These strings are surrounded by the backtick/backquote (`` ` ``) character, and embedded expressions are of the form `${ expr }`.
```ts
let fullName: string = `Bob Bobbington`;
let age: number = 37;
let sentence: string = `Hello, my name is ${ fullName }.
I'll be ${ age + 1 } years old next month.`
```
This is equivalent to declaring `sentence` like so:
```ts
let sentence: string = "Hello, my name is " + fullName + ".\n\n" +
"I'll be " + (age + 1) + " years old next month."
```
# Array
Arrays allow you to work with an expandable sequence of values, addressed by an integer-valued index.
Array types can be written in one of two ways.
In the first, you use the type of the elements followed by `[]` to denote an array of that element type:
```ts
let list: number[] = [1, 2, 3];
```
The second way uses a generic array type, `Array<elemType>`:
```ts
let list: Array<number> = [1, 2, 3];
```
### ~hint
For the micro:bit, all elements of an array must have the same type.
### ~
# Enum
A helpful addition to the standard set of datatypes from JavaScript is the `enum`.
As in languages like C#, an enum is a way of giving more friendly names to sets of numeric values.
```ts
enum Color {Red, Green, Blue};
let c: Color = Color.Green;
```
By default, enums begin numbering their members starting at `0`.
You can change this by manually setting the value of one of its members.
For example, we can start the previous example at `1` instead of `0`:
```ts
enum Color {Red = 1, Green, Blue};
let c: Color = Color.Green;
```
Or, even manually set all the values in the enum:
```ts
enum Color {Red = 1, Green = 2, Blue = 4};
let c: Color = Color.Green;
```
# Any
The TypeScript type `any` is not supported in the micro:bit.
# Void
`void` is the absence of having any type at all.
You may commonly see this as the return type of functions that do not return a value:
```ts
function warnUser(): void {
basic.showString("This is my warning message");
}
```
Declaring variables of type `void` is not useful.
# Type Inference
In TypeScript, there are several places where type inference is used to provide type information when there is
no explicit type annotation. For example, in this code
```ts
let x = 3;
let y = x + 3
```
The type of the `x` variable is inferred to be `number`. Similarly, the type of `y` variable also is inferred to be `number`.
This kind of inference takes place when initializing variables and members,
setting parameter default values, and determining function return types.
### ~button /js/classes
NEXT: Classes
### ~

121
docs/js/variables.md Normal file
View File

@ -0,0 +1,121 @@
# Variable Declarations
Declaring a variable in JavaScript has always traditionally been done with the `var` keyword.
```typescript
var a = 10;
```
The `var` construct has some [problems](http://www.typescriptlang.org/docs/handbook/variable-declarations.html),
which is why `let` statements were introduced. Apart from the keyword used, `let` statements are written
the same way `var` statements are.
```typescript
let a = 10;
```
The key difference is not in the syntax, but in the semantics, which we'll now dive into.
## Block-scoping
When a variable is declared using `let`, it uses what some call *lexical-scoping* or *block-scoping*.
Unlike variables declared with `var` whose scopes leak out to their containing function,
block-scoped variables are not visible outside of their nearest containing block or `for`-loop.
```typescript
function f(input: boolean) {
let a = 100;
if (input) {
// Still okay to reference 'a'
let b = a + 1;
return b;
}
// Error: 'b' doesn't exist here
return b;
}
```
Here, we have two local variables `a` and `b`.
`a`'s scope is limited to the body of `f` while `b`'s scope is limited to the containing `if` statement's block.
Another property of block-scoped variables is that they can't be read or written to before they're actually declared.
While these variables are "present" throughout their scope, all points up until their declaration are part of their *temporal dead zone*.
This is just a sophisticated way of saying you can't access them before the `let` statement, and luckily TypeScript will let you know that.
```typescript
a++; // illegal to use 'a' before it's declared;
let a;
```
## Re-declarations
With `var` declarations, it doesn't matter how many times you declare your variables, you just get one:
```typescript
var x = 10;
var x = 20;
```
In the above example, all declarations of `x` actually refer to the *same* `x`, and this is perfectly valid.
This often ends up being a source of bugs. Thankfully, `let` declarations are not as forgiving.
```typescript
let x = 10;
let x = 20; // error: can't re-declare 'x' in the same scope
```
## Shadowing
The act of introducing a new name in a more deeply nested scope is called *shadowing*.
It is a bit of a double-edged sword in that it can introduce certain bugs on its own in the
event of accidental shadowing, while also preventing certain bugs.
For instance, imagine a `sumMatrix` function using `let` variables.
```typescript
function sumMatrix(matrix: number[][]) {
let sum = 0;
for (let i = 0; i < matrix.length; i++) {
var currentRow = matrix[i];
for (let i = 0; i < currentRow.length; i++) {
sum += currentRow[i];
}
}
return sum;
}
```
This version of the loop will actually perform the summation correctly because the inner loop's `i` shadows `i` from the outer loop.
Shadowing should *usually* be avoided in the interest of write clearer code, such as
```typescript
function sumMatrix(matrix: number[][]) {
let sum = 0;
for (let i = 0; i < matrix.length; i++) {
var currentRow = matrix[i];
for (let j = 0; j < currentRow.length; j++) {
sum += currentRow[j];
}
}
return sum;
}
```
While there are some scenarios where it may be fitting to take advantage of it, you should use your best judgement.
# `const` declarations
`const` declarations are another way of declaring variables.
```typescript
const numLivesForCat = 9;
```
They are like `let` declarations but, as their name implies, their value cannot be changed once they are bound.
In other words, they have the same scoping rules as `let`, but you can't re-assign to them.
### ~button /js/operators
NEXT: Operators
### ~

View File

@ -41,7 +41,7 @@ Now let's add some more types of instructions for the player to follow. Let's ad
/**
* {highlight}
*/
export function newAction_() {
export function newAction() {
action = Math.random(4) // ***
if (action == 0) {
basic.showString("PUSH A", 150) // ***

View File

@ -21,10 +21,10 @@ let count = 0
## 3. If the rectangle below represents the BBC micro:bit, shade the areas that will be displayed after two button presses on Button A. Explain why that particular area is shaded.
```blocks
let count_ = 0
let count = 0
input.onButtonPressed(Button.A, () => {
count_ = count_ + 1
basic.showNumber(count_, 100)
count = count + 1
basic.showNumber(count, 100)
})
```
@ -37,10 +37,10 @@ After two button presses, **count** will be equal to 2.
## 5. If the rectangle below represents the BBC micro:bit, shade the areas that will be displayed after five button presses on Button A. Explain why that particular area is shaded.
```blocks
let count_ = 0
let count = 0
input.onButtonPressed(Button.A, () => {
count_ = count_ + 1
basic.showNumber(count_, 100)
count = count + 1
basic.showNumber(count, 100)
})
```

View File

@ -23,10 +23,10 @@ let count = 0
## 3. Draw which LED is ON after running this code and pressing Button A twice. Explain why you chose to draw that number
```blocks
let count_ = 0
let count = 0
input.onButtonPressed(Button.A, () => {
count_ = count_ + 1
basic.showNumber(count_, 100)
count = count + 1
basic.showNumber(count, 100)
})
```
@ -37,10 +37,10 @@ input.onButtonPressed(Button.A, () => {
## 4. Draw which LED is ON after running this code and pressing Button A five times. Explain why you chose to draw that number.
```blocks
let count_ = 0
let count = 0
input.onButtonPressed(Button.A, () => {
count_ = count_ + 1
basic.showNumber(count_, 100)
count = count + 1
basic.showNumber(count, 100)
})
```

View File

@ -15,7 +15,7 @@ Write the line of code to measure the acceleration and then store in it a variab
<br/>
```blocks
let accX_ = input.acceleration("x")
let accX = input.acceleration("x")
```
Note: acceleration does not have be measured in the "x" direction. It can also be in the "y" or "z" direction.

View File

@ -14,7 +14,7 @@ Here are some cool projects that you can build with your micro:bit!
"imageUrl": "/static/mb/projects/a2-buttons.png"
},{
"name": "Love Meter",
"url":"/projects/lover-meter",
"url":"/projects/love-meter",
"imageUrl":"/static/mb/projects/a3-pins.png"
},{
"name": "Rock Paper Scissors",

View File

@ -59,5 +59,6 @@ input.onPinPressed(TouchPin.P2, () => {
* click *run* to see if the code works as expected.
### ~button /projects/telegraph
NEXT: Telegraph
### ~

View File

@ -104,3 +104,6 @@ basic.forever(() => {
});
```
### ~button /projects/hack-your-headphones
NEXT: Hack Your Headphones
### ~

View File

@ -112,4 +112,8 @@ basic.pause(500);
basic.clearScreen();
basic.pause(500);
})
```
```
### ~button /projects/smiley-buttons
NEXT: Smiley Buttons
### ~

View File

@ -71,3 +71,6 @@ input.onButtonPressed(Button.A, () => {
* click *compile* and run your code on the micro:bit.
### ~button /projects/banana-keyboard
NEXT: Banana Keyboard
### ~

View File

@ -47,4 +47,8 @@ input.onPinPressed(TouchPin.P2, () => {
. . # . .
`);
});
```
```
### ~button /projects/rock-paper-scissors
NEXT: Rock Paper Scissors
### ~

View File

@ -86,3 +86,7 @@ Have fun reviewing your simulation and analyze the acceleration by chart the Exc
* The first person and second person take turns tilting the micro:bit in the "x" direction while the other player charts the data on the micro:bit!
* Review and analyze the actual micro:bit device acceleration data on Excel
* Display acceleration with y or z using plot bar graph by changing acceleration from "x" to "y" or "z"
### ~button /projects/the-watch
NEXT: The Watch
### ~

View File

@ -235,3 +235,7 @@ input.onButtonPressed(Button.B, () => {
How else can you make your game better?
Ever hear of [Rock Paper Scissors Spock Lizard](http://www.samkass.com/theories/RPSSL.html)?
### ~button /projects/compass
NEXT: Compass
### ~

View File

@ -66,4 +66,8 @@ input.onButtonPressed(Button.B, () => {
# . . . #
. # # # .`);
});
```
```
### ~button /projects/love-meter
NEXT: Love Meter
### ~

View File

@ -108,3 +108,7 @@ Your telegraph is ready!
* Connect the first micro:bit to your computer using your USB cable and put the telegraph script on it.
* Connect the second micro:bit to your computer using your USB cable and run the telegraph script on it.
* The first person and second person take turns pressing button A to play the telegraph game!
### ~button /projects/radio
NEXT: Radio
### ~

View File

@ -9,7 +9,7 @@ basic.showString("Hello!")
### Parameters
* `text` is a [String](/reference/types/string). It can contain letters, numbers, and punctuation.
* `ms` is an optional [Number](/reference/types/number). It means the number of milliseconds before sliding the [String](/reference/types/string) left by one LED each time. Bigger intervals make the sliding slower.
* `interval` is an optional [Number](/reference/types/number). It means the number of milliseconds before sliding the [String](/reference/types/string) left by one LED each time. Bigger intervals make the sliding slower.
### Examples:

View File

@ -0,0 +1,99 @@
# About Bluetooth
![](/static/bluetooth/Bluetooth_SIG.png)
## Introduction
Bluetooth is a wireless communications technology which allows devices to communicate with each other without the need for a central device like a router or access point.
Bluetooth has a special "low energy feature" which means it can be used without requiring much power from the devices using it. It's the Bluetooth low energy feature which the micro:bit uses.
In the world of Bluetooth low energy, a device has something called a "profile" which defines the way other devices are able to communicate over Bluetooth with it. In a way, the Bluetooth profile defines the way a device appears to other devices in terms of its features and the things it can do.
To put it another way, a Bluetooth profile is really an interface specification. It defines the data which a device has, what another device can do with that data over a Bluetooth connection and how the device with the profile should respond when a connected device acts upon its data in some way. Let's look at that description in a little more technical detail.
## Basic Concepts
A Bluetooth device contains a table of data called an Attribute Table which can be accessed by other connected devices in various possible ways. That table of data and the ways in which it can be exploited falls into a technical area of Bluetooth called the Generic Attribute profile or "GATT" for short and you may see the term GATT in some of the documentation for APIs such as those provided by the Android platform.
The Attribute Table contains something like a series of records of various types. The main types are called Services, Characteristics and Descriptors. Let's look at each of these terms in turn.
### Attributes
Services, Characteristics and Descriptors are all types of Attribute. Hence Generic Attribute Profile, Attribute Table and something called the Attribute Protocol. All attributes have a type which is identified by a UUID (Universally Unique Identifer). Some Attributes are defined by the Bluetooth SIG, the technical standards body for Bluetooth and these have UUIDs which are 16 bits in length. Some Attributes are custom designed for a particular device by the product team and these have 128 bit UUIDs. The micro:bit uses a mixture of 16 bit and 128 bit UUIDs.
### Structure
Services, Characteristics and Descriptors are organised in a hierarchy with Services at the top and Descriptors at the bottom. Services contain one or more Characteristics. A Characteristic owns zero or more Descriptors. Zero because Descriptors are completely optional whereas a Service must contain at least one Characteristic.
![](/static/bluetooth/gatt_hierarchy.png)
### Services
A Service is a container for logically related Bluetooth data items. Those data items are in fact called Characteristics. A Service can be thought of as the owner of the Characteristics inside it. Often a Service represents a particular feature (e.g. a hardware feature) of a device like the buttons or a particular sensor. An example of a Bluetooth SIG defined Service is the Device Information Service which, as the name suggests, is a container for various items of information about the device such as its manufacturer and serial number. The micro:bit has this service.
### Characteristics
Characteristics are items of data which relate to a particular internal state of the device or perhaps some state of the environment which the device can measure using a sensor. The current battery level is an example of internal state data whereas the ambient temperature could perhaps be measured by a sensor. Sometimes Characteristics represent configuration data such as the frequency at which you want something to be measured. In any of these cases, the way a device can expose such data to other devices to use via Bluetooth is by making them available as a Characteristic. An example of a Bluetooth SIG defined Characteristic is the Serial Number String which you'll find inside the Device Information service.
Characteristics contain various parts. They have a type, a value, some properties and some permissions.
Type is something already explained above, a UUID value which indicates which particular type of Characteristic an Attribute is. Value is the value of the associated state data item.
Properties define what another device can do with the characteristic over Bluetooth in terms of various defined operations such as READ, WRITE or NOTIFY. Reading a characteristic means transferring its current value from the attribute table to the connected device over Bluetooth. Writing allows the connected device to change that value in the state table. Notifications are a special message type which a device like the micro:bit can send to a connected device whenever the value of the associated characteristic changes or perhaps periodically, controlled by a timer. Not all Characteristics support all operations. The Characteristic's properties tell you which operations are supported.
Sometimes the device will have been programmed to respond in a special way when it processes an operation like reading or writing a value from the attribute table so operations can result in more happening than simply transferring data across the connection. Perhaps changing the value of a Characteristic will result in the device changing the frequency with which it samples readings from the device accelerometer for example.
Permissions are to do with security and further describe the security conditions that must be met before read or write access to the characteristic is to be granted.
### Descriptors
Descriptors contain meta data which either augments the details relating to the Characteristic which the Descriptor belongs to or allows the configuration of a behaviour involving that Characteristic. Notification messages are switched on or off using a special descriptor called the Client Characteristic Configuration Descriptor for example.
### Profile
A Bluetooth profile is a specification which pulls together all the required information about how a device behaves, how it can be accessed in terms of its services, characteristics and descriptors, security rules, concurrency limitations and so on.
## Client Server Architecture
When a smartphone application interacts with a device like the micro:bit over a Bluetooth connection we have a client/server architecture. The phone application is usually the GATT client and the micro:bit is usually the GATT server. They communicate using a protocol called the Attribute Protocol or just ATT for short. As a smartphone developer you work with APIs and do not have to worry about formulating ATT protocol data units and so on.
![](/static/bluetooth/services_and_GATT.png)
## Device Discovery
Everything described above relates to devices which are connected and communicating as GATT client and server. But there's a stage which precedes this where the two devices are not yet connected. How do they find each other and connect? The answer to this question is termed 'Device Discovery' and is the responsibility of another part of the Bluetooth architecture called the Generic Access Profile (GAP).
In GAP, one devices advertises, emitting small packets of data periodically. These packets contain information about the device doing the advertising. Other devices looking for devices to connect to perform something called scanning, receiving and processing advertising packets and filtering out those that come from devices of a type that are not of interest. Usually the user is given information about devices which are discovered and they then select one to be connected to. The device which advertises is called a Bluetooth Peripheral whereas the one doing the scanning is a Bluetooth Central device. micro:bit is a Bluetooth peripheral.
Bluetooth on the BBC micro:bit
Full documentation for the BBC micro:bit Bluetooth profile as used by this application can be found at the [Lancaster University documentation](http://lancaster-university.github.io/microbit-docs/ble/profile/) web site.
The micro:bit's accelerometer (motion detector), magnetometer (digital compass), two buttons on the front, LED Display, IO pins on the edge connector, internal message bus and internal temperature sensor are all exposed as Services so that applications can exploit these features of the device. In addition:
* the Bluetooth SIG defined Device Information Service is included to allow applications to obtain information such as firmware version details over Bluetooth
* there's a Device Firmware Update (DFU) service which allows new micro:bit code to be flahsed to the device over Bluetooth instead of over USB
* there's a UART service which allows arbitrary data to be exchanged with the micro:bit in a way resembling traditional serial communications.
Everything you can do with the micro:bit over Bluetooth is achieved through read, write and notify operations. Not all characteristics support all three so check the profile documentation. Often there are Characteristics whose purpose is to allow you to write configuration values which control other behviours. Technically these are called Control Points. For example you can specify the frequency with which accelerometer data is sampled before it is transmitted as a Notification message to your application.
## Want to Know More?
The Bluetooth SIG web site at http://www.bluetooth.com is a good place for further information about Bluetooth in general. You'll find all the SIG defined profiles, services, characteristics and descriptors there as well as the core specification for all Bluetooth technology.
That's it! Enjoy using Bluetooth on the BBC micro:bit!
Martin Woolley, Bluetooth SIG. Twitter: @bluetooth_mdw
#### Video
https://www.youtube.com/watch?v=aep_GVowKfs
### See also
[About Bluetooth](/reference/bluetooth/about-bluetooth), [micro:bit Bluetooth profile overview ](http://lancaster-university.github.io/microbit-docs/ble/profile/), [micro:bit Bluetooth profile reference](http://lancaster-university.github.io/microbit-docs/resources/bluetooth/microbit-profile-V1.9-Level-2.pdf), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html), [Bluetooth SIG](https://www.bluetooth.com)
```package
microbit-bluetooth
```

View File

@ -92,7 +92,8 @@ If you do find yourself needing to pair again you will first need to remove the
### See also
[Bluetooth SIG](https://www.bluetooth.com), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html)
[About Bluetooth](/reference/bluetooth/about-bluetooth), [micro:bit Bluetooth profile overview ](http://lancaster-university.github.io/microbit-docs/ble/profile/), [micro:bit Bluetooth profile reference](http://lancaster-university.github.io/microbit-docs/resources/bluetooth/microbit-profile-V1.9-Level-2.pdf), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html), [Bluetooth SIG](https://www.bluetooth.com)
```package
microbit-bluetooth

View File

@ -30,7 +30,7 @@ http://www.youtube.com/watch?v=HyBcsD9Eh6I
### See also
[Bluetooth SIG](https://www.bluetooth.com), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html)
[About Bluetooth](/reference/bluetooth/about-bluetooth), [micro:bit Bluetooth profile overview ](http://lancaster-university.github.io/microbit-docs/ble/profile/), [micro:bit Bluetooth profile reference](http://lancaster-university.github.io/microbit-docs/resources/bluetooth/microbit-profile-V1.9-Level-2.pdf), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html), [Bluetooth SIG](https://www.bluetooth.com)
```package
microbit-bluetooth

View File

@ -30,7 +30,7 @@ http://www.youtube.com/watch?v=HyBcsD9Eh6I
### See also
[Bluetooth SIG](https://www.bluetooth.com), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html)
[About Bluetooth](/reference/bluetooth/about-bluetooth), [micro:bit Bluetooth profile overview ](http://lancaster-university.github.io/microbit-docs/ble/profile/), [micro:bit Bluetooth profile reference](http://lancaster-university.github.io/microbit-docs/resources/bluetooth/microbit-profile-V1.9-Level-2.pdf), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html), [Bluetooth SIG](https://www.bluetooth.com)
```package
microbit-bluetooth

View File

@ -35,7 +35,7 @@ For more advanced information on the micro:bit Bluetooth accelerometer service i
### See also
[Bluetooth SIG](https://www.bluetooth.com), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html)
[About Bluetooth](/reference/bluetooth/about-bluetooth), [micro:bit Bluetooth profile overview ](http://lancaster-university.github.io/microbit-docs/ble/profile/), [micro:bit Bluetooth profile reference](http://lancaster-university.github.io/microbit-docs/resources/bluetooth/microbit-profile-V1.9-Level-2.pdf), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html), [Bluetooth SIG](https://www.bluetooth.com)
```package
microbit-bluetooth

View File

@ -39,7 +39,7 @@ For more advanced information on the micro:bit Bluetooth button service includin
### See also
[Bluetooth SIG](https://www.bluetooth.com),[Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html)
[About Bluetooth](/reference/bluetooth/about-bluetooth), [micro:bit Bluetooth profile overview ](http://lancaster-university.github.io/microbit-docs/ble/profile/), [micro:bit Bluetooth profile reference](http://lancaster-university.github.io/microbit-docs/resources/bluetooth/microbit-profile-V1.9-Level-2.pdf), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html), [Bluetooth SIG](https://www.bluetooth.com)
```package
microbit-bluetooth

View File

@ -33,7 +33,7 @@ For more advanced information on the micro:bit Bluetooth IO pin service includin
### See also
[Bluetooth SIG](https://www.bluetooth.com), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html)
[About Bluetooth](/reference/bluetooth/about-bluetooth), [micro:bit Bluetooth profile overview ](http://lancaster-university.github.io/microbit-docs/ble/profile/), [micro:bit Bluetooth profile reference](http://lancaster-university.github.io/microbit-docs/resources/bluetooth/microbit-profile-V1.9-Level-2.pdf), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html), [Bluetooth SIG](https://www.bluetooth.com)
```package
microbit-bluetooth

View File

@ -35,7 +35,7 @@ For more advanced information on the micro:bit Bluetooth LED service including i
### See also
[Bluetooth SIG](https://www.bluetooth.com), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html)
[About Bluetooth](/reference/bluetooth/about-bluetooth), [micro:bit Bluetooth profile overview ](http://lancaster-university.github.io/microbit-docs/ble/profile/), [micro:bit Bluetooth profile reference](http://lancaster-university.github.io/microbit-docs/resources/bluetooth/microbit-profile-V1.9-Level-2.pdf), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html), [Bluetooth SIG](https://www.bluetooth.com)
```package
microbit-bluetooth

View File

@ -35,7 +35,7 @@ For more advanced information on the micro:bit Bluetooth magnetometer service in
### See also
[Bluetooth SIG](https://www.bluetooth.com), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html)
[About Bluetooth](/reference/bluetooth/about-bluetooth), [micro:bit Bluetooth profile overview ](http://lancaster-university.github.io/microbit-docs/ble/profile/), [micro:bit Bluetooth profile reference](http://lancaster-university.github.io/microbit-docs/resources/bluetooth/microbit-profile-V1.9-Level-2.pdf), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html), [Bluetooth SIG](https://www.bluetooth.com)
```package

View File

@ -35,7 +35,7 @@ For more advanced information on the micro:bit Bluetooth temperature service inc
### See also
[Bluetooth SIG](https://www.bluetooth.com), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html)
[About Bluetooth](/reference/bluetooth/about-bluetooth), [micro:bit Bluetooth profile overview ](http://lancaster-university.github.io/microbit-docs/ble/profile/), [micro:bit Bluetooth profile reference](http://lancaster-university.github.io/microbit-docs/resources/bluetooth/microbit-profile-V1.9-Level-2.pdf), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html), [Bluetooth SIG](https://www.bluetooth.com)
```package

View File

@ -37,7 +37,7 @@ For more advanced information on the micro:bit Bluetooth UART service including
### See also
[Bluetooth SIG](https://www.bluetooth.com), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html)
[About Bluetooth](/reference/bluetooth/about-bluetooth), [micro:bit Bluetooth profile overview ](http://lancaster-university.github.io/microbit-docs/ble/profile/), [micro:bit Bluetooth profile reference](http://lancaster-university.github.io/microbit-docs/resources/bluetooth/microbit-profile-V1.9-Level-2.pdf), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html), [Bluetooth SIG](https://www.bluetooth.com)
```package
microbit-bluetooth

View File

@ -18,16 +18,15 @@ bluetooth.uartRead("");
### Example: Starting the Bluetooth UART service and then reading data received from another device which is terminated by ":" character and then displaying it
```blocks
let uart_data: string = "";
let uartData = "";
let connected = 0;
basic.showString("UART");
bluetooth.startUartService();
bluetooth.onBluetoothConnected(() => {
basic.showString("C");
connected = 1;
while (connected == 1) {
uart_data = bluetooth.uartRead(":");
basic.showString(uart_data);
uartData = bluetooth.uartRead(":");
basic.showString(uartData);
}
});
bluetooth.onBluetoothDisconnected(() => {
@ -46,7 +45,7 @@ For more advanced information on the micro:bit Bluetooth UART service including
### See also
[Bluetooth SIG](https://www.bluetooth.com), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html)
[About Bluetooth](/reference/bluetooth/about-bluetooth), [micro:bit Bluetooth profile overview ](http://lancaster-university.github.io/microbit-docs/ble/profile/), [micro:bit Bluetooth profile reference](http://lancaster-university.github.io/microbit-docs/resources/bluetooth/microbit-profile-V1.9-Level-2.pdf), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html), [Bluetooth SIG](https://www.bluetooth.com)
```package
microbit-bluetooth

View File

@ -27,7 +27,6 @@ bluetooth.onBluetoothDisconnected(() => {
basic.showString("D");
connected = 0;
});
bluetooth.startUartService();
input.onButtonPressed(Button.A, () => {
if (connected == 1) {
bluetooth.uartWrite("HELLO");
@ -45,7 +44,7 @@ For more advanced information on the micro:bit Bluetooth UART service including
### See also
[Bluetooth SIG](https://www.bluetooth.com), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html)
[About Bluetooth](/reference/bluetooth/about-bluetooth), [micro:bit Bluetooth profile overview ](http://lancaster-university.github.io/microbit-docs/ble/profile/), [micro:bit Bluetooth profile reference](http://lancaster-university.github.io/microbit-docs/resources/bluetooth/microbit-profile-V1.9-Level-2.pdf), [Bluetooth on micro:bit resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html), [Bluetooth SIG](https://www.bluetooth.com)
```package
microbit-bluetooth

View File

@ -0,0 +1,11 @@
# Device Name
Gets a friendly name for the device derived from the its serial number.
```sig
control.deviceName();
```
**This is an advanced API.** For more information, see the
[micro:bit runtime messageBus documentation](https://lancaster-university.github.io/microbit-docs/ubit/messageBus/).

View File

@ -0,0 +1,10 @@
# Device Serial Number
Derive a unique, consistent serial number of this device from internal data.
```sig
control.deviceSerialNumber();
```
**This is an advanced API.** For more information, see the
[micro:bit runtime messageBus documentation](https://lancaster-university.github.io/microbit-docs/ubit/messageBus/).

View File

@ -0,0 +1,10 @@
# Event Source ID
Return a code representing the origin of the event on the bus (button, pin, radio, and so on).
```sig
control.eventSourceId(EventBusSource.MICROBIT_ID_BUTTON_A);
```
**This is an advanced API.** For more information, see the
[micro:bit runtime messageBus documentation](https://lancaster-university.github.io/microbit-docs/ubit/messageBus/)

View File

@ -0,0 +1,10 @@
# Event Timestamp
Get the timestamp of the last event executed on the bus
```sig
control.eventTimestamp();
```
**This is an advanced API.** For more information, see the
[micro:bit runtime messageBus documentation](https://lancaster-university.github.io/microbit-docs/ubit/messageBus/).

View File

@ -0,0 +1,12 @@
# Event Value ID
Return a code representing the type of the event (button click, device gesture, and so on).
```sig
control.eventValueId(EventBusValue.MICROBIT_EVT_ANY);
```
**This is an advanced API.** For more information, see the
[micro:bit runtime messageBus documentation](https://lancaster-university.github.io/microbit-docs/ubit/messageBus/).

View File

@ -0,0 +1,12 @@
# Event Value
Get the value of the last event executed on the bus.
```sig
control.eventValue();
```
**This is an advanced API.** For more information, see the
[micro:bit runtime messageBus documentation](https://lancaster-university.github.io/microbit-docs/ubit/messageBus/).

View File

@ -1,15 +1,25 @@
# In Background
# Run In Background
Run code in the background as a separate process or thread; for more information on this advanced construct, see [the micro:bit - a reactive system](/device/reactive).
Run part of a program while the rest of it is doing something else.
```sig
control.inBackground(() => {
})
```
### ~hint
For more information, read
[The micro:bit - a reactive system](/device/reactive).
It is pretty advanced!
### ~
### Example
The example below shows how a background process can be used to display the current value of the global variable `num`, while code (like the `on button pressed` handler) can change the value of the variable.
This program shows how running in the background can say what is
stored in a variable like `num`, while another part (``on button pressed``)
changes what is stored there.
```blocks
let num = 0
@ -24,7 +34,8 @@ input.onButtonPressed(Button.A, () => {
})
```
The code below using the `forever` loop is equivalent to the code above
This program does the same thing, but in a more usual way,
with a ``forever`` loop.
```blocks
let num = 0
@ -36,20 +47,8 @@ input.onButtonPressed(Button.A, () => {
})
```
### Contention for the LED display
If you have multiple processes that each show something on the LED screen, you may get unexpected results. Try, for example:
```blocks
basic.forever(() => {
basic.showNumber(6789, 150)
})
input.onButtonPressed(Button.A, () => {
basic.showNumber(2, 150)
})
```
### See also
[while](/blocks/loops/while), [forever](/reference/basic/forever), [on button pressed](/reference/input/on-button-pressed)
[while](/blocks/loops/while), [forever](/reference/basic/forever),
[on button pressed](/reference/input/on-button-pressed)

View File

@ -0,0 +1,11 @@
# On Event
Raise an event in the event bus.
```sig
control.onEvent(control.eventSourceId(EventBusSource.MICROBIT_ID_BUTTON_A), control.eventValueId(EventBusValue.MICROBIT_EVT_ANY), () => { });
```
**This is an advanced API.** For more information, see the
[micro:bit runtime messageBus documentation](https://lancaster-university.github.io/microbit-docs/ubit/messageBus/).

View File

@ -0,0 +1,10 @@
# Raise Event
Raise an event in the event bus.
```sig
control.raiseEvent(control.eventSourceId(EventBusSource.MICROBIT_ID_BUTTON_A), control.eventValueId(EventBusValue.MICROBIT_EVT_ANY));
```
**This is an advanced API.** For more information, see the
[micro:bit runtime messageBus documentation](https://lancaster-university.github.io/microbit-docs/ubit/messageBus/)

View File

@ -0,0 +1,37 @@
# Get Sprite Property
Change the kind of [number](/reference/types/number) you say for a [sprite](/reference/game/create-sprite).
```sig
let item: game.LedSprite = null;
item.set(LedSpriteProperty.X, 0);
```
### Parameters
* the **sprite** you want to change
* the kind of [number](/reference/types/number) you want to change for the sprite, like
* ``x``, how far up or down the sprite is on the screen (`0`-`4`)
* ``y``, how far left or right the sprite is on the screen (`0`-`4`)
* ``direction``, which way the sprite is pointing (this works the same way as the [turn](/reference/game/turn) function)
* ``brightness``, how bright the LED sprite is (this works the same way as the [brightness](/reference/led/brightness) function)
* ``blink``, how fast the sprite is blinking (the bigger the number is, the faster the sprite is blinking)
### Example
This program makes a sprite on the left side of the screen,
waits two seconds (2000 milliseconds),
and then moves it to the middle of the screen.
```blocks
let ball = game.createSprite(0, 2);
basic.pause(2000);
ball.change(LedSpriteProperty.X, 2);
```
### See also
[turn](/reference/game/turn),
[brightness](/reference/led/brightness),
[get sprite property](/reference/game/get-sprite-property),
[set sprite property](/reference/game/set-sprite-property)

View File

@ -1,21 +0,0 @@
# Change
Sprite will change the x position by this number
### Block Editor
![](/static/mb/change-0.png)
### JavaScript
Sprite will change the x position by this number
```
export function changeXBy(_this: micro_bitSprites.LedSprite, x: number)
```
Sprite will change the y position by this number
```
export function changeYBy(_this: micro_bitSprites.LedSprite, y: number)
```

View File

@ -0,0 +1,37 @@
# Create Sprite
Create a new LED sprite pointing to the right.
A sprite is like a little LED creature you can tell what to do.
You can tell it to move, turn, and check whether it has bumped
into another sprite.
```sig
game.createSprite(2, 2);
```
### Parameters
* ``x``: The left-to-right place on the LED screen where the sprite will start out.
* ``y``: The top-to-bottom place on the LED screen where the sprite will start out.
`0` and `4` mean the edges of the screen, and `2` means in the middle.
### Example
This program starts a sprite in the middle of the screen.
Next, the sprite turns toward the lower-right corner.
Finally, it moves two LEDs away to the corner.
```blocks
let item = game.createSprite(2, 2);
item.turn(Direction.Right, 45);
item.move(2);
```
### See also
[move](/reference/game/move),
[turn](/reference/game/turn),
[touching](/reference/game/touching)

View File

@ -86,7 +86,7 @@ Sprite - If the sprite is on the edge, the sprite will bounce
![](/static/mb/game-library/if-on-edge-bounce-0.png)
```
export function ifOnEdge_Bounce(_this: micro_bitSprites.LedSprite)
export function ifOnEdgeBounce(_this: micro_bitSprites.LedSprite)
```
### [Change score by](/reference/game/change-score-by)

View File

@ -2,6 +2,10 @@
End the game and show the score.
```sig
game.gameOver();
```
### Example
This program asks you to pick a button.

View File

@ -0,0 +1,39 @@
# Get Sprite Property
Find something out about a [sprite](/reference/game/create-sprite).
```sig
let item: game.LedSprite = null;
item.get(LedSpriteProperty.X);
```
### Parameters
* the **sprite** you want to know something about
* the kind of [number](/reference/types/number) you want to know about the sprite, like
* ``x``, how far up or down the sprite is on the screen (`0`-`4`)
* ``y``, how far left or right the sprite is on the screen (`0`-`4`)
* ``direction``, which way the sprite is pointing (this works the same way as the [turn](/reference/game/turn) function)
* ``brightness``, how bright the LED sprite is (this works the same way as the [brightness](/reference/led/brightness) function)
* ``blink``, how fast the sprite is blinking (the bigger the number is, the faster the sprite is blinking)
### Returns
The [number](/reference/types/number) you asked for.
### Example
This program makes a sprite and shows the number of its brightness on the screen.
```blocks
let ball = game.createSprite(0, 2);
basic.showNumber(ball.get(LedSpriteProperty.Brightness));
```
### See also
[turn](/reference/game/turn),
[brightness](/reference/led/brightness),
[change sprite property](/reference/game/change-sprite-property),
[set sprite property](/reference/game/set-sprite-property)

View File

@ -0,0 +1,34 @@
# If On Edge, Bounce
Make a [sprite](/reference/game/create-sprite) on the edge of the
[LED screen](/device/screen) bounce away.
```sig
let item = game.createSprite(0, 2);
item.ifOnEdgeBounce();
```
### Parameters
* a **sprite** that might be on the edge of the LED screen.
### Example
This program makes a sprite on the right edge of the screen with a
direction of 90 degrees, and bounces it so it has a direction of -90
degrees -- exactly the opposite direction.
```blocks
let ball = game.createSprite(4, 2);
basic.showNumber(ball.get(LedSpriteProperty.Direction));
input.onButtonPressed(Button.B, () => {
ball.ifOnEdgeBounce();
basic.showNumber(ball.get(LedSpriteProperty.Direction));
});
```
### See also
[create sprite](/reference/game/create-sprite),
[touching](/reference/game/touching),
[touching edge](/reference/game/touching-edge)

View File

@ -1,7 +1,29 @@
# Move
Sprite move by a certain number of LEDs
Move the sprite the number of LEDs you say.
```sig
let item: game.LedSprite = null;
item.move(1);
```
export function move(_this: micro_bitSprites.LedSprite, leds: number)
### Parameters
* a [number](/reference/types/number) that means how many LEDs the sprite should move
### Example
This program starts a sprite in the middle of the screen.
Next, the sprite turns toward the lower-right corner.
Finally, it moves two LEDs away to the corner.
```blocks
let item = game.createSprite(2, 2);
item.turn(Direction.Right, 45);
item.move(2);
```
### See also
[turn](/reference/game/turn),
[create sprite](/reference/game/create-sprite)

View File

@ -0,0 +1,37 @@
# Set Sprite Property
Make a [sprite](/reference/game/create-sprite) store the kind of [number](/reference/types/number) you say.
```sig
let item: game.LedSprite = null;
item.set(LedSpriteProperty.X, 0);
```
### Parameters
* the **sprite** you want to make store the number you say
* the kind of [number](/reference/types/number) you want to store in the sprite, like
* ``x``, how far up or down the sprite is on the screen (`0`-`4`)
* ``y``, how far left or right the sprite is on the screen (`0`-`4`)
* ``direction``, which way the sprite is pointing (this works the same way as the [turn](/reference/game/turn) function)
* ``brightness``, how bright the LED sprite is (this works the same way as the [brightness](/reference/led/brightness) function)
* ``blink``, how fast the sprite is blinking (the bigger the number is, the faster the sprite is blinking)
### Example
This program makes a sprite on the left side of the screen,
waits two seconds (2000 milliseconds),
and then moves it to the right side of the screen.
```blocks
let ball = game.createSprite(0, 2);
basic.pause(2000);
ball.set(LedSpriteProperty.X, 4);
```
### See also
[turn](/reference/game/turn),
[brightness](/reference/led/brightness),
[change sprite property](/reference/game/change-sprite-property),
[get sprite property](/reference/game/get-sprite-property)

View File

@ -8,7 +8,7 @@ game.startCountdown(1000)
### Parameters
* a [number](/reference/types/number) that means how many milliseconds to count down (one second is 1000 milliseconds)
* ``ms`` is a [number](/reference/types/number) that says how many milliseconds to count down (one second is 1000 milliseconds)
### Examples

View File

@ -0,0 +1,40 @@
# Touching Edge
Find whether the sprite is touching the edge of the [LED screen](/device/screen).
Sprites are touching the edge if they overlap with an LED on the edge
of the screen.
```sig
let item: game.LedSprite = null;
item.isTouchingEdge();
```
### Parameters
* a **sprite** that might be touching the edge of the screen
### Returns
`true` if the sprite is touching the edge of the screen
### Example
This program makes a sprite in the middle of the left edge of the LED screen.
Then it says `EDGY!` if it's on the edge (which it is!), and `SAFE!` if it's
not on the edge.
```blocks
let item = game.createSprite(0, 2);
if (item.isTouchingEdge()) {
basic.showString("EDGY!");
} else {
basic.showString("SAFE!");
}
```
### See also
[create sprite](/reference/game/create-sprite),
[touching](/reference/game/touching),
[if on edge, bounce](/reference/game/if-on-edge-bounce)

View File

@ -1,8 +1,41 @@
# Touching
Reports true if sprite is touching specified sprite
Find whether the sprite is touching another sprite you say.
```
export function isTouching(_this: micro_bitSprites.LedSprite, other: micro_bitSprites.LedSprite) : boolean
Sprites are touching if they share the same LED.
```sig
let item: game.LedSprite = null;
item.isTouching(null);
```
### Parameters
* a **sprite** you are checking
* another **sprite** that might be touching the one you are checking
### Returns
`true` if the two sprites are touching.
### Example
This program creates two sprites called ``matter`` and ``antimatter``,
and then checks whether they are touching. If they are, there is an
explosion.
```blocks
let matter = game.createSprite(2, 2);
let antimatter = game.createSprite(2, 2);
if (matter.isTouching(antimatter)) {
basic.pause(500);
basic.clearScreen();
basic.showString("BOOM!");
}
```
### See also
[create sprite](/reference/game/create-sprite),
[touching edge](/reference/game/touching-edge),
[if on edge, bounce](/reference/game/if-on-edge-bounce)

View File

@ -1,14 +1,33 @@
# Turn
Rotates a sprite to the right by a certain number of degrees
Turn the sprite as much as you say in the direction you say.
```
export function turnRight(_this: micro_bitSprites.LedSprite, degrees: number)
```sig
let item: game.LedSprite = null;
item.turn(Direction.Right, 45);
```
Rotates a sprite to the left by a certain number of degrees
### Parameters
```
export function turnLeft(_this: micro_bitSprites.LedSprite, degrees: number)
* a choice whether the sprite should turn **left** or **right**
* a [number](/reference/types/number) that means how much the sprite should turn.
This number is in **degrees**, so a straight left or right turn is 90 degrees.
### Example
This program starts a sprite in the middle of the screen.
Next, the sprite turns toward the lower-right corner.
Finally, it moves two LEDs away to the corner.
```blocks
let item = game.createSprite(2, 2);
item.turn(Direction.Right, 45);
item.move(2);
```
### See also
[move](/reference/game/move),
[create sprite](/reference/game/create-sprite)

View File

@ -4,7 +4,7 @@ Make a big [image](/reference/images/image) (picture) for the micro:bit
[LED screen](/device/screen). The big image made of two squares.
Each of the squares is five LEDs on a side, like a regular image.
```blocks
```sig
images.createBigImage(`
. . # . . . . # . .
. # # # . . . # . .
@ -14,6 +14,12 @@ images.createBigImage(`
`);
```
### Parameters
* ``leds`` is a [string](/reference/types/string) that says which LEDs
on the screen should be on and which should be off.
### Example: Flip-flopping arrow
This program makes a big image with a picture of an arrow pointing up,

View File

@ -13,6 +13,11 @@ images.createImage(`
`)
```
### Parameters
* ``leds`` is a [string](/reference/types/string) that says which LEDs
on the screen should be on and which should be off.
### Example: Flip-flopping arrow
If you press button `A`, this program will make a picture of an

View File

@ -3,9 +3,14 @@
Scroll (slide) an [image](/reference/images/image) (picture) from one
side to the other of the [LED screen](/device/screen).
```sig
let item: Image = null;
item.scrollImage(5, 200);
```
### Parameters
* ``offset`` is a [number](/reference/types/number) that means
* a [number](/reference/types/number) that means
how many LEDs to scroll at a time, from right to left or
left to right. If you use a positive number like `2`, the image
will scroll from the right side of the screen to the left.
@ -15,7 +20,7 @@ side to the other of the [LED screen](/device/screen).
image. It is a square with five LEDs on a side). This is
useful for **animation**.
* ``interval (ms)`` is a [number](/reference/types/number) that means
* a [number](/reference/types/number) that means
how many milliseconds to wait before scrolling the amount that
``offset`` says. (1000 milliseconds is one second.) The bigger you
make this number, the slower the image will scroll.

View File

@ -4,6 +4,11 @@ Show an [image](/reference/images/image) (picture) on the
[LED screen](/device/screen). After the micro:bit shows an image, it
will pause for 400 milliseconds (1000 milliseconds is one second).
```sig
let item: Image = null;
item.showImage(0);
```
### Parameters
* an [image](/reference/images/image) (picture). It is usually a square with five LEDs on a side, but it might be wider.

View File

@ -19,7 +19,7 @@ A **g** is as much acceleration as you get from Earth's gravity.
### Parameters
* which direction you are checking for acceleration, either `Dimension.X` (left and right), `Dimension.Y` (forward and backward), or `Dimension.Z` (up and down)
* ``dimension`` means which direction you are checking for acceleration, either `Dimension.X` (left and right), `Dimension.Y` (forward and backward), or `Dimension.Z` (up and down)
### Returns
@ -38,5 +38,7 @@ basic.forever(() => {
### See also
[compass-heading](/reference/input/compass-heading), [lightlevel](/reference/input/light-level)
[set accelerometer range](/reference/input/set-accelerometer-range),
[compass heading](/reference/input/compass-heading),
[light level](/reference/input/light-level)

View File

@ -8,7 +8,7 @@ input.buttonIsPressed(Button.A);
### Parameters
* ``name`` is a [String](/reference/types/string). You should store `A` in it to check the left button, `B` to check the right button, or `A+B` to check both at the same time.
* ``button`` is a [String](/reference/types/string). You should store `A` in it to check the left button, `B` to check the right button, or `A+B` to check both at the same time.
### Returns

View File

@ -15,7 +15,10 @@ The micro:bit measures magnetic force with **microteslas**.
### Parameters
* a [string](/reference/types/string) that says which direction the micro:bit should measure magnetic force in: either `x` (the left-right direction), `y` (the forward/backward direction), or `z` (the up/down direction)
* ``dimension`` means which direction the micro:bit should measure
magnetic force in: either `Dimension.X` (the left-right direction),
`Dimension.Y` (the forward/backward direction), or `Dimension.Z`
(the up/down direction)
### Returns

View File

@ -2,14 +2,18 @@
Start an [event handler](/reference/event-handler) (part of the
program that will run when something happens) This handler works when
you do a **gesture** (like shake, tilt, or drop the micro:bit).
you do a **gesture** (like shaking the micro:bit).
```sig
input.onGesture(Gesture.Shake,() => {
})
```
## Example: random number
### Parameters
* ``gesture`` means the way you hold or move the micro:bit. This can be `shake`, `logo up`, `logo down`, `screen up`, `screen down`, `tilt left`, `tilt right`, `free fall`, `3g`, or `6g`.
### Example: random number
This program shows a number from `0` to `9` when you shake the micro:bit.

View File

@ -1,14 +1,16 @@
# On Pin Pressed
Start an [event handler](/reference/event-handler) (part of the program
that will run when something happens, like when a button is pressed).
This handler works when you press pin `0`, `1`, or `2` together with `GND`.
When you are using this function in a web browser, click the pins on the screen instead of the ones
on the BBC micro:bit.
Start an [event handler](/reference/event-handler) (part of the
program that will run when something happens, like when a button is
pressed). This handler works when you press pin `0`, `1`, or `2`
together with `GND`. When you are using this function in a web
browser, click the pins on the screen instead of the ones on the BBC
micro:bit.
If you hold the `GND` pin with one hand and touch pin `0`, `1`, or `2` with the other,
a very small (safe) amount of electricity will flow through your body and back into
the micro:bit. This is called **completing a circuit**. It's like you're a big wire!
If you hold the `GND` pin with one hand and touch pin `0`, `1`, or `2`
with the other, a very small (safe) amount of electricity will flow
through your body and back into the micro:bit. This is called
**completing a circuit**. It's like you're a big wire!
```sig
input.onPinPressed(TouchPin.P0, () => {
@ -22,6 +24,10 @@ instead of the USB cable.
## ~
## Parameters
* ``name`` means the pin that is being pressed, either `P0`, `P1`, or `P2`
### Example: pin pressed counter
This program counts how many times you press the `P0` pin.

View File

@ -15,7 +15,7 @@ check how the micro:bit is moving.
### Parameters
* which direction you are checking: `Rotation.Pitch` (up and down) or `Rotation.Roll` (left and right)
* ``kind`` means which direction you are checking: `Rotation.Pitch` (up and down) or `Rotation.Roll` (left and right)
### Returns

View File

@ -0,0 +1,41 @@
# Set Accelerometer Range
Set up the part of the micro:bit that measures
[acceleration](/reference/input/acceleration) (how much the microbit
is speeding up or slowing down), in case you need to measure high
or low acceleration.
```sig
input.setAccelerometerRange(AcceleratorRange.OneG);
```
### Parameters
* ``range`` means the biggest number of gravities of acceleration you
will be measuring (either `1g`, `2g`, `4g`, or `8g`). Any bigger numbers
will be ignored by your micro:bit, both when you are picking a
number of gravities, and when you are measuring acceleration.
### Example
This program says the highest acceleration that your micro:bit
will measure is 4G. Then it measures acceleration from side to side
until you stop the program.
```blocks
input.setAccelerometerRange(AcceleratorRange.FourG);
basic.forever(() => {
basic.showNumber(input.acceleration(Dimension.X));
});
```
#### ~hint
This program does not work in the simulator, only in a micro:bit.
#### ~
### See Also
[compass heading](/reference/input/compass-heading),
[light level](/reference/input/light-level)

View File

@ -9,8 +9,13 @@ led.plotBarGraph(2, 20);
### Parameters
* `value` is a [Number](/reference/types/number) that means what you are measuring or trying to show. For example, if you are measuring the temperature of ice with the BBC micro:bit, `value` might be 0 because the temperature might be 0 degrees centigrade.
* `high` is a [Number](/reference/types/number) that means the highest possible number that the `value` parameter can be. This number is also the tallest that the lines in the bar chart can be.
* ``value`` is a [number](/reference/types/number) that means what you
are measuring or trying to show. For example, if you are measuring
the temperature of ice with the BBC micro:bit, ``value`` might be `0`
because the temperature might be 0 degrees centigrade.
* ``high`` is a [number](/reference/types/number) that means the highest
possible number that the ``value`` parameter can be. This number is
also the tallest that the lines in the bar chart can be.
### Example: chart acceleration

View File

@ -14,8 +14,11 @@ Use [unplot](/reference/led/unplot) to turn **off** an LED.
### Parameters
* **x** is a [number](/reference/types/number) that means the horizontal spot on the LED screen (from left to right: 0, 1, 2, 3, or 4)
* **y** is a [number](/reference/types/number) that means the vertical spot on the LED screen (from top to bottom: 0, 1, 2, 3, or 4)
* ``x`` is a [number](/reference/types/number) that means the
horizontal spot on the LED screen (from left to right: 0, 1, 2, 3,
or 4)
* ``y`` is a [number](/reference/types/number) that means the vertical
spot on the LED screen (from top to bottom: 0, 1, 2, 3, or 4)
If a parameter is [out of bounds](/reference/out-of-bounds) (a value
other than 0 to 4), then this function will do nothing.

View File

@ -9,8 +9,11 @@ led.point(0,0);
### Parameters
* **x** is a [number](/reference/types/number) that means the horizontal spot on the LED screen (from left to right: 0, 1, 2, 3, or 4)
* **y** is a [number](/reference/types/number) that means the vertical spot on the LED screen (from top to bottom: 0, 1, 2, 3, or 4)
* ``x`` is a [number](/reference/types/number) that means the
horizontal spot on the LED screen (from left to right: 0, 1, 2, 3,
or 4)
* ``y`` is a [number](/reference/types/number) that means the vertical
spot on the LED screen (from top to bottom: 0, 1, 2, 3, or 4)
If a parameter is [out of bounds](/reference/out-of-bounds) (a value
other than 0 to 4), this function will return `false`.

View File

@ -9,13 +9,16 @@ led.setBrightness(121)
### Parameters
* a [number](/reference/types/number) that means how bright the screen is when it is turned on, from `0` (darkest) to `255` (brightest). For example, the number `127` means the screen is halfway bright when it is turned on.
* ``value`` is a [number](/reference/types/number) that means how
bright the screen is when it is turned on, from `0` (darkest) to
`255` (brightest). For example, the number `127` means the screen is
halfway bright when it is turned on.
### Example: change brightness
This program makes the screen brightness 100% (255). Then it turns on
This program makes the screen brightness 100% (`255`). Then it turns on
the center LED (`2, 2`), waits for one second, and then sets the screen
brightness to 50% (128):
brightness to 50% (`128`):
```blocks
led.setBrightness(255)
@ -27,4 +30,3 @@ led.setBrightness(led.brightness() / 2)
### See also
[brightness](/reference/led/brightness), [fade in](/reference/led/fade-in), [fade out](/reference/led/fade-out), [LED screen](/device/screen)

View File

@ -1,8 +1,22 @@
# Stop Animation
Cancels the current animation and clears other pending animations .
Stop the animation that is playing and any animations that are waiting to
play.
```sig
led.stopAnimation()
```
### Example
This program...
```blocks
basic.showString("STOP ME! STOP ME! PLEASE, WON'T SOMEBODY STOP ME?");
input.onButtonPressed(Button.B, () => {
led.stopAnimation();
});
'```
### See Also

View File

@ -14,8 +14,11 @@ Use [plot](/reference/led/plot) to turn **on** an LED.
### Parameters
* **x** is a [number](/reference/types/number) that means the horizontal spot on the LED screen (from left to right: 0, 1, 2, 3, or 4)
* **y** is a [number](/reference/types/number) that means the vertical spot on the LED screen (from top to bottom: 0, 1, 2, 3, or 4)
* ``x`` is a [number](/reference/types/number) that means the
horizontal spot on the LED screen (from left to right: 0, 1, 2, 3,
or 4)
* ``y`` is a [number](/reference/types/number) that means the vertical
spot on the LED screen (from top to bottom: 0, 1, 2, 3, or 4)
If a parameter is [out of bounds](/reference/out-of-bounds) (a value
other than 0 to 4), then this function will do nothing.

View File

@ -13,7 +13,9 @@ music.changeTempoBy(20)
### Parameters
* a [number](/reference/types/number) that says how much to change the bpm (beats per minute, or number of beats in a minute of the music that the micro:bit is playing).
* ``bpm`` is a [number](/reference/types/number) that says how much to
change the bpm (beats per minute, or number of beats in a minute of
the music that the micro:bit is playing).
### Examples

View File

@ -12,8 +12,8 @@ music.playTone(440, 120)
### Parameters
* `Hz` is the [Number](/reference/types/number) of Hertz (the frequency, how high or low the tone is).
* `ms` is the [Number](/reference/types/number) of milliseconds that the tone lasts.
* ``frequency`` is the [number](/reference/types/number) of Hertz (how high or low the tone is).
* ``ms`` is the [number](/reference/types/number) of milliseconds that the tone lasts
## Example

View File

@ -12,7 +12,9 @@ music.rest(400)
### Parameters
* a [number](/reference/types/number) saying how many milliseconds the micro:bit should rest. One second is 1000 milliseconds.
* ``ms`` is a [number](/reference/types/number) saying how many
milliseconds the micro:bit should rest. One second is 1000
milliseconds.
## Example

View File

@ -13,8 +13,8 @@ music.ringTone(440)
### Parameters
* a [number](/reference/types/number) that says the tone's
**frequency** (how high-pitched or low-pitched the tone is). This
* ``frequency`` is a [number](/reference/types/number) that says
how high-pitched or low-pitched the tone is. This
number is in **Hz** (**Hertz**), which is a measurement of frequency
or pitch.

View File

@ -11,7 +11,7 @@ This function only works on the micro:bit and in some browsers.
### Parameters
* a [number](/reference/types/number) that means the bpm you want (beats per minute, or number of beats in a minute of the music that the micro:bit is playing).
* ``bpm`` is a [number](/reference/types/number) that means the beats per minute you want (the number of beats in a minute of the music that the micro:bit is playing).
### See also

View File

@ -8,7 +8,8 @@ music.tempo()
### Returns
* a [Number](/reference/types/number) that means the bpm (beats per minute, or number of beats in a minute of the music that the micro:bit is playing).
* a [number](/reference/types/number) that means the beats per minute (number of
beats in a minute of the music that the micro:bit is playing).
### See also

View File

@ -1,6 +1,6 @@
# Analog Pitch
Emits a Pulse With Modulation (PWM) signal to the current pitch [pin](/device/pins). Use [analog set pitch pin](/reference/pins/analog-set-pitch-pin) to set the pitch pin.
Emits a Pulse With Modulation (PWM) signal to the current pitch [pin](/device/pins). Use [analog set pitch pin](/reference/pins/analog-set-pitch-pin) to set the current pitch pin.
```sig
pins.analogPitch(440, 300)

View File

@ -9,7 +9,7 @@ pins.analogReadPin(AnalogPin.P0)
### Parameters
* a [string](/reference/types/string) that stores the name of the pin
* ``name`` is a [string](/reference/types/string) with the name of the pin
you say (`P0` through `P4`, or `P10`)
### Returns
@ -26,6 +26,12 @@ basic.forever(() => {
});
```
#### ~hint
If you are using **analog read pin** with another micro:bit running **analog write pin**, then things can get tricky. Remember that the micro:bit that runs **analog set pin** writes 0's and 1's at a very high frequency to achieve an average of the desired value. Sadly, if you try to read that average from another micro:bit, then the micro:bit will either read 0 or 1023. You could try to read a higher number of values (e.g. a million) in a loop, then computer then average. Alternatively, you can plug in a capacitor in-between the two micro:bits.
#### ~
### See also
[micro:bit pins](/device/pins),

View File

@ -1,6 +1,8 @@
# Analog Set Period
Configures the period of the Pulse Width Modulation (PWM) on the specified analog [pin](/device/pins) (``P0``, ``P1`` or ``P2``). Prior to calling this function, the given pin should be set as analog.
Configure the period of Pulse Width Modulation (PWM) on the specified
analog [pin](/device/pins).
Before you call this function, you should set the specified pin as analog.
```sig
pins.analogSetPeriod(AnalogPin.P0, 20000)
@ -8,10 +10,11 @@ pins.analogSetPeriod(AnalogPin.P0, 20000)
### Parameters
* `name` - [String](/reference/types/string); the pin name ("P0", "P1", or "P2")
* `micros` - a [Number](/reference/types/number) representing the micro-seconds of the analog period.
* ``name``: a [string](/reference/types/string) that specifies the pin to configure (`P0` through `P4`, or `P10`)
* ``micros``: a [number](/reference/types/number) that specifies the analog period in microseconds.
The following code
The following code first sets `P0` to analog with **analog write
pin**, and then sets the PWM period of `P0` to 20,000 microseconds.
```blocks
pins.analogWritePin(AnalogPin.P0, 512)
@ -20,5 +23,9 @@ pins.analogSetPeriod(AnalogPin.P0, 20000)
### See also
[micro:bit pins](/device/pins), [on pin pressed](/reference/input/on-pin-pressed), [analog read pin](/reference/pins/analog-read-pin), [digital read pin](/reference/pins/digital-read-pin), [digital write pin](/reference/pins/digital-write-pin)
[micro:bit pins](/device/pins),
[on pin pressed](/reference/input/on-pin-pressed),
[analog read pin](/reference/pins/analog-read-pin),
[analog write pin](/reference/pins/analog-write-pin),
[digital read pin](/reference/pins/digital-read-pin),
[digital write pin](/reference/pins/digital-write-pin)

Some files were not shown because too many files have changed in this diff Show More