Skip to content

Commit a399314

Browse files
committed
initial commit of making things smart code samples
1 parent f4e692f commit a399314

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+2583
-2
lines changed

README.md

+101-2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,101 @@
1-
# making-things-smart
2-
Code examples for the Making Things Smart book
1+
# Making Things Smart
2+
3+
Extra information for the 'Making Things Smart' book by Gordon Williams
4+
5+
This code is designed for [Espruino JavaScript Microcontroller boards](http://www.espruino.com/Order)
6+
7+
## Code Examples
8+
9+
### Chapter 5
10+
11+
* [Experiment 4 Part 1](experiment4a.js)
12+
* [Experiment 4 Part 2](experiment4b.js)
13+
* [Experiment 5](experiment5.js)
14+
15+
### Chapter 6
16+
17+
* [Experiment 6](experiment6.js)
18+
* [Experiment 7](experiment7.js)
19+
* [Experiment 8](experiment8.js)
20+
21+
### Chapter 7
22+
23+
* [Experiment 9 Part 1](experiment9a.js)
24+
* [Experiment 9 Part 2](experiment9b.js)
25+
* [Experiment 9 Part 3](experiment9c.js)
26+
* [Experiment 9 Part 4](experiment9d.js)
27+
* [Experiment 10 Part 1](experiment10a.js)
28+
* [Experiment 10 Part 2](experiment10b.js)
29+
30+
### Chapter 8
31+
32+
* [Experiment 11](experiment11.js)
33+
* [Experiment 12](experiment12.js)
34+
* [Experiment 13](experiment13.js)
35+
36+
### Chapter 9
37+
38+
* [Experiment 14 Part 1](experiment14a.js)
39+
* [Experiment 14 Part 2](experiment14b.js)
40+
* [Experiment 14 Part 3](experiment14c.js)
41+
* [Experiment 14 Part 4](experiment14d.js)
42+
43+
### Chapter 10
44+
45+
* [Experiment 15](experiment15.js)
46+
47+
### Chapter 11
48+
49+
* [Experiment 16](experiment16.js)
50+
51+
52+
### Chapter 13
53+
54+
* [Experiment 19 Part 1](experiment19a.html)
55+
* [Experiment 19 Part 2](experiment19b.html)
56+
* [Experiment 20](experiment20.html)
57+
* [Experiment 21](experiment21.html)
58+
* [Experiment 22](experiment22.html)
59+
60+
### Chapter 14
61+
62+
* [Experiment 25](experiment25.js)
63+
* [Experiment 26](experiment26.html)
64+
65+
### Chapter 15
66+
67+
* [Experiment 28](experiment28.js)
68+
* [Experiment 29](experiment29.js)
69+
* [Experiment 30](experiment30.js)
70+
* [Experiment 31](experiment31.js)
71+
* [Experiment 32](experiment32.js)
72+
73+
### Chapter 16
74+
75+
* [Experiment 34 Espruino JavaScript](experiment34.js)
76+
* [Experiment 34 HTML](experiment34.html)
77+
* [Experiment 35](experiment35.js)
78+
* [Experiment 36 Espruino JavaScript](experiment36.js)
79+
* [Experiment 36 HTML](experiment36.html)
80+
81+
### Chapter 17
82+
83+
* [Experiment 38 Part 1](experiment38a.js)
84+
* [Experiment 38 Part 2](experiment38b.js)
85+
* [Experiment 38 Part 3 HTML](experiment38c.html)
86+
* [Experiment 38 Part 4 HTML](experiment38d.html)
87+
* [Experiment 38 Part 5](experiment38e.js)
88+
89+
### Chapter 18
90+
91+
* [Experiment 39 HTML Test page](experiment39.html)
92+
* [Experiment 39 Part 1](experiment39a.js)
93+
* [Experiment 39 Part 2](experiment39b.js)
94+
95+
96+
97+
## Purchasing Information
98+
99+
Where to find some of the component parts used in the book.
100+
101+
... to come soon.

experiment10a.js

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
var SENSE = A8;
2+
var LIGHT = B6;
3+
var counter = 0;
4+
5+
var blades = 7;
6+
var t = 1000 / blades;
7+
var pulses = [5];
8+
for (var i=0;i<blades;i++) pulses.push(t-5, 5);
9+
10+
var lastPulseTime;
11+
12+
function onChanged(e) {
13+
counter++;
14+
if (counter&1) {
15+
var d = e.time - lastPulseTime;
16+
lastPulseTime = e.time;
17+
var p = pulses.map(function(t) { return t*d; });
18+
digitalPulse(LIGHT, 1, p);
19+
}
20+
}
21+
22+
pinMode(SENSE, "input_pullup");
23+
setWatch(onChanged, SENSE, { edge:"rising", repeat:true });

experiment10b.js

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
var SENSE = A8;
2+
var LIGHT = B6;
3+
var counter = 0;
4+
5+
var blades = 7; // number of fan blades
6+
var t = 1000 / blades;
7+
var pulses = [ // ensure one line per fan blade
8+
50, t-50,
9+
5, 40, 5, t-50,
10+
5, 40, 5, t-50,
11+
5, 40, 5, t-50,
12+
5, 40, 5, t-50,
13+
5, 40, 5, t-50,
14+
50];
15+
16+
var lastPulseTime;
17+
18+
function onChanged(e) {
19+
counter++;
20+
if (counter&1) {
21+
var d = e.time - lastPulseTime;
22+
lastPulseTime = e.time;
23+
var p = pulses.map(function(t) { return t*d; });
24+
digitalPulse(LIGHT, 1, p);
25+
}
26+
}
27+
28+
pinMode(SENSE, "input_pullup");
29+
setWatch(onChanged, SENSE, { edge:"rising", repeat:true });

experiment10c.js

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
var SENSE = A8;
2+
var LIGHT = B6;
3+
var counter = 0;
4+
5+
var blades = 7; // number of fan blades
6+
var t = 1000 / blades;
7+
var pulses = [50];
8+
9+
var lastPulseTime;
10+
11+
function onChanged(e) {
12+
counter++;
13+
if (counter&1) {
14+
var d = e.time - lastPulseTime;
15+
lastPulseTime = e.time;
16+
var p = pulses.map(function(t) { return t*d; });
17+
digitalPulse(LIGHT, 1, p);
18+
}
19+
}
20+
21+
pinMode(SENSE, "input_pullup");
22+
setWatch(onChanged, SENSE, { edge:"rising", repeat:true });
23+
24+
function toPulses(img) {
25+
pulses = [];
26+
// We're pulsing high at the start of the image
27+
var lastPixel = true;
28+
// the time the light will be on or off for
29+
var time = 0;
30+
// iterate over the image
31+
for (var y in img) {
32+
var line = img[y];
33+
for (var x in line) {
34+
var pixel = line[x]!=" ";
35+
if (pixel!=lastPixel) {
36+
// if this pixel is different, output the time
37+
pulses.push(time);
38+
time = 0;
39+
lastPixel = pixel;
40+
}
41+
time += 5;
42+
}
43+
// end of line, turn off
44+
if (lastPixel) {
45+
pulses.push(time);
46+
time = 0;
47+
lastPixel = false;
48+
}
49+
time += t - line.length*5;
50+
}
51+
}
52+
53+
toPulses([
54+
"XX XX",
55+
"XX XX",
56+
" ",
57+
"X X",
58+
" X X ",
59+
" XXXX "]);
60+
61+
/* or...
62+
63+
toPulses([
64+
"XXXXX",
65+
"X X",
66+
"X X",
67+
"XXXXX",
68+
"X X",
69+
"X X",
70+
"XXXXX"]);
71+
*/

experiment11.js

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// the position of the motor
2+
var pos = 0;
3+
4+
// To be called every so often to tell the servo where to go
5+
function updateServo() {
6+
digitalPulse(B3, 1, E.clip(1.5+pos, 1, 2));
7+
}
8+
9+
// Now make sure we call the function every 50ms
10+
setInterval(updateServo, 50);
11+
12+
/*
13+
14+
// To move the servo around
15+
function updateServo() {
16+
pos = Math.sin(getTime()) * 0.5;
17+
digitalPulse(B3, 1, E.clip(1.5+pos, 1, 2));
18+
}
19+
20+
// Tomove the servo using PWM
21+
function updateServo() {
22+
pos = Math.sin(getTime()) * 0.5;
23+
var len = E.clip(1.5+pos, 1, 2);
24+
analogWrite(B3, len/50, {freq:20})
25+
}
26+
*/

experiment12.js

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
var motors = [0,0];
2+
function updateServos() {
3+
// Left
4+
digitalPulse(B3, 1, E.clip(1.5+motors[0], 1, 2));
5+
// Right
6+
digitalPulse(B4, 1, E.clip(1.5-motors[1], 1, 2));
7+
}
8+
setInterval(updateServos, 20);
9+
10+
// the names of our movements
11+
var FWD = [1,1];
12+
var BACK = [0,0];
13+
var LEFT = [-1,1];
14+
var RIGHT = [1,-1];
15+
var STOP = [0,0];
16+
17+
function go(moves) {
18+
// take the first command off our array
19+
var move = moves.shift();
20+
21+
if (move) {
22+
// Move the motors
23+
motors = move;
24+
// Call ourselves again in half a second, with the remaining list of moves
25+
setTimeout(go, 500, moves);
26+
} else
27+
motors = STOP;
28+
}
29+
30+
setWatch(function() {
31+
go([FWD,LEFT,FWD,BACK]);
32+
}, BTN, {repeat:true, edge:"rising", debounce:50});

experiment13.js

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
var motors = [0,0];
2+
function updateServos() {
3+
var left = darkValue - analogRead(A5);
4+
if (left < 0) left = 0;
5+
var right = darkValue - analogRead(A6);
6+
if (right < 0) right = 0;
7+
motors[0] = right;
8+
motors[1] = left;
9+
10+
digitalPulse(B3, 1, E.clip(1.5+motors[0], 1, 2));
11+
digitalPulse(B4, 1, E.clip(1.5-motors[1], 1, 2));
12+
}
13+
setInterval(updateServos, 20);

experiment14a.js

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Draws a circle
2+
var PEN_DOWN = PEN_DOWN_VALUE_HERE; // motors[2] when pen touches paper
3+
var PEN_UP = PEN_UP_VALUE_HERE; // motors[2] when pen is away from paper
4+
var OFFSET_LEFT = 0.1; // offset to make left servo horizontal
5+
var OFFSET_RIGHT = -0.1; // offset to make right servo horizontal
6+
7+
var motors = [0,0,PEN_UP];
8+
9+
function updateServos() {
10+
getNewPosition();
11+
digitalPulse(B3, 1, E.clip(1.5+(motors[0]+OFFSET_LEFT), 1, 2));
12+
digitalPulse(B3, 1, 0); // wait for pulse
13+
digitalPulse(B4, 1, E.clip(1.5-(motors[1]+OFFSET_RIGHT), 1, 2));
14+
digitalPulse(B4, 1, 0); // wait for pulse
15+
digitalPulse(B5, 1, E.clip(1.5+motors[2], 1, 2)); // Pen
16+
}
17+
18+
var pos = 0;
19+
var size = 0.1;
20+
21+
function getNewPosition() {
22+
// increment pos slowly between 0 and 1
23+
pos += 0.002;
24+
if (pos > 1) pos = 0;
25+
// Work out an angle between 0 and 360 degrees, but in Radians
26+
var angle = pos * Math.PI * 2;
27+
// Now use sin and cos to move the servos in a circular motion
28+
motors[0] = Math.sin(angle)*size;
29+
motors[1] = Math.cos(angle)*size;
30+
}
31+
32+
setInterval(updateServos, 20);

experiment14b.js

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// Draws a diamond
2+
var PEN_DOWN = PEN_DOWN_VALUE_HERE; // motors[2] when pen touches paper
3+
var PEN_UP = PEN_UP_VALUE_HERE; // motors[2] when pen is away from paper
4+
var OFFSET_LEFT = 0.1; // offset to make left servo horizontal
5+
var OFFSET_RIGHT = -0.1; // offset to make right servo horizontal
6+
7+
var motors = [0,0,PEN_UP];
8+
9+
function updateServos() {
10+
getNewPosition();
11+
digitalPulse(B3, 1, E.clip(1.5+(motors[0]+OFFSET_LEFT), 1, 2));
12+
digitalPulse(B3, 1, 0); // wait for pulse
13+
digitalPulse(B4, 1, E.clip(1.5-(motors[1]+OFFSET_RIGHT), 1, 2));
14+
digitalPulse(B4, 1, 0); // wait for pulse
15+
digitalPulse(B5, 1, E.clip(1.5+motors[2], 1, 2)); // Pen
16+
}
17+
18+
var pos = 0;
19+
var size = 0.1;
20+
21+
function getNewPosition() {
22+
// increment pos slowly between 0 and 1
23+
pos += 0.002;
24+
if (pos > 1) pos = 0;
25+
// Multiply by 4, for each edge of the square
26+
var sq = pos*4;
27+
// Now set the position for each edge:
28+
if (sq<1) { // top edge
29+
motors[0] = (sq-0.5)*2*size;
30+
motors[1] = -size;
31+
} else if (sq<2) { // right edge
32+
motors[0] = size;
33+
motors[1] = (sq-1.5)*2*size;
34+
} else if (sq<3) { // bottom edge
35+
motors[0] = (2.5-sq)*2*size;
36+
motors[1] = size;
37+
} else { // left edge
38+
motors[0] = -size;
39+
motors[1] = (3.5-sq)*2*size;
40+
}
41+
}
42+
43+
setInterval(updateServos, 20);

0 commit comments

Comments
 (0)