Presentation as given to LTS
After Width: | Height: | Size: 1.2 MiB |
After Width: | Height: | Size: 336 KiB |
After Width: | Height: | Size: 916 KiB |
After Width: | Height: | Size: 252 KiB |
After Width: | Height: | Size: 30 KiB |
After Width: | Height: | Size: 336 KiB |
Before Width: | Height: | Size: 274 KiB After Width: | Height: | Size: 203 KiB |
After Width: | Height: | Size: 74 KiB |
After Width: | Height: | Size: 394 KiB |
After Width: | Height: | Size: 215 KiB |
After Width: | Height: | Size: 48 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 6.4 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 42 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 68 KiB |
After Width: | Height: | Size: 237 KiB |
After Width: | Height: | Size: 51 KiB |
|
@ -0,0 +1,55 @@
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_Sensor.h>
|
||||||
|
#include <Adafruit_TSL2561_U.h>
|
||||||
|
#include "Adafruit_CCS811.h"
|
||||||
|
#include "DHT.h"
|
||||||
|
|
||||||
|
#define DHTPIN 2
|
||||||
|
#define DHTTYPE DHT11
|
||||||
|
|
||||||
|
Adafruit_CCS811 ccs;
|
||||||
|
DHT dht(DHTPIN, DHTTYPE);
|
||||||
|
Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
Serial.println("Let's Talk Science!");
|
||||||
|
|
||||||
|
dht.begin();
|
||||||
|
ccs.begin();
|
||||||
|
tsl.begin();
|
||||||
|
|
||||||
|
while(!ccs.available());
|
||||||
|
float temp = ccs.calculateTemperature();
|
||||||
|
ccs.setTempOffset(temp - 25.0);
|
||||||
|
|
||||||
|
tsl.enableAutoRange(true);
|
||||||
|
tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
delay(500);
|
||||||
|
float humidity = dht.readHumidity();
|
||||||
|
float temp = dht.readTemperature();
|
||||||
|
|
||||||
|
Serial.print(humidity);
|
||||||
|
Serial.print(" ");
|
||||||
|
Serial.print(temp);
|
||||||
|
Serial.print(" ");
|
||||||
|
|
||||||
|
ccs.readData();
|
||||||
|
int co2 = ccs.geteCO2();
|
||||||
|
int tvoc = ccs.getTVOC();
|
||||||
|
|
||||||
|
Serial.print(co2/100);
|
||||||
|
Serial.print(" ");
|
||||||
|
Serial.print(tvoc/10);
|
||||||
|
Serial.print(" ");
|
||||||
|
|
||||||
|
sensors_event_t event;
|
||||||
|
tsl.getEvent(&event);
|
||||||
|
|
||||||
|
Serial.print(event.light/10);
|
||||||
|
|
||||||
|
Serial.println("");
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 9383ee8daacada2e1091092c334ed11c03dc5f27
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit e985f2253a687ef377cde3dcfb1f788830d1bc09
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 0c88fba4e7658a9425bbcaca78a58e6a7abfd17e
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit c97897771807613d456b318236e18a04b013410b
|
|
@ -1,9 +1,14 @@
|
||||||
[file]
|
[file]
|
||||||
talk.ebook.pdf
|
talk.ebook.pdf
|
||||||
|
[skip]
|
||||||
|
7,8,9,
|
||||||
|
[end_user_slide]
|
||||||
|
6
|
||||||
[notes]
|
[notes]
|
||||||
### 2
|
### 2
|
||||||
29### 4
|
29### 4
|
||||||
Nuit Blanche - Take over the city w/ interactive art
|
Nuit Blanche - Take over the city w/ interactive art
|
||||||
Work in Practice @ Explode (Illustrators explaining their artistic practice and portfolio feedback)### 22
|
Work in Practice @ Explode (Illustrators explaining their artistic practice and portfolio feedback)### 9
|
||||||
|
### 22
|
||||||
Devices that are 'on' have current flowing through them. Most of what we'll do today is getting current to flow through devices in various ways.### 23
|
Devices that are 'on' have current flowing through them. Most of what we'll do today is getting current to flow through devices in various ways.### 23
|
||||||
Potential is the push that moves current.
|
Potential is the push that moves current.
|
|
@ -11,9 +11,9 @@ colorlinks: true
|
||||||
|
|
||||||
By the end of this class, you'll:
|
By the end of this class, you'll:
|
||||||
|
|
||||||
- Know how to create programs for Arduino and run them.
|
|
||||||
- Be familiar with basic electionics concepts
|
- Be familiar with basic electionics concepts
|
||||||
-
|
- Assemble a kit of sensors into a complete system
|
||||||
|
- Know how to program the Arduino platform to collect and plot the sensor data
|
||||||
|
|
||||||
## UnPacked / Unlondon
|
## UnPacked / Unlondon
|
||||||
|
|
||||||
|
@ -30,51 +30,6 @@ membership and the community-at-large.
|
||||||
- ExplodeConf
|
- ExplodeConf
|
||||||
- Nuit Blanche
|
- Nuit Blanche
|
||||||
|
|
||||||
## Shawn: Day Job
|
|
||||||
|
|
||||||
Embedded Systems Designer, Monadnock Systems
|
|
||||||
|
|
||||||
- Indoor location tracking w/ Bluetooth
|
|
||||||
- Keychain / Fitness Band Widgets
|
|
||||||
- Joystick for VR
|
|
||||||
- Remote Controls
|
|
||||||
- Internet of S*#t
|
|
||||||
|
|
||||||
## Shawn: The Fun Stuff
|
|
||||||
|
|
||||||
Hacker, Church of the Weird Machine, Odd Duck
|
|
||||||
|
|
||||||
\begin{columns}[c]
|
|
||||||
\column{0.50\textwidth}
|
|
||||||
|
|
||||||
\begin{itemize}
|
|
||||||
\item Arduino compatible implant
|
|
||||||
\item EEG Games / Toy Hacking
|
|
||||||
\item Brain Stimulation
|
|
||||||
\item Be Weird, Make Weird, Have Fun!
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
\column{0.50\textwidth}
|
|
||||||
\begin{center}
|
|
||||||
\includegraphics[width=0.95\textwidth]{images/timbo.jpg}
|
|
||||||
\vspace{5mm}
|
|
||||||
\includegraphics[width=0.95\textwidth]{images/circadia.jpg}
|
|
||||||
\end{center}
|
|
||||||
\end{columns}
|
|
||||||
|
|
||||||
## Titus: Day Job
|
|
||||||
|
|
||||||
Executive Director, UnPacked
|
|
||||||
|
|
||||||
- 121Studios
|
|
||||||
- St. Thomas STEM Centre
|
|
||||||
- &c
|
|
||||||
|
|
||||||
## Titus: The Fun Stuff
|
|
||||||
|
|
||||||
Thinker, Jack of all Trades
|
|
||||||
|
|
||||||
|
|
||||||
# What's in your kit?
|
# What's in your kit?
|
||||||
|
|
||||||
## Kit Contents
|
## Kit Contents
|
||||||
|
@ -88,10 +43,11 @@ Thinker, Jack of all Trades
|
||||||
###Sensors
|
###Sensors
|
||||||
- Temperature / Humidity
|
- Temperature / Humidity
|
||||||
- Light Sensor
|
- Light Sensor
|
||||||
|
- CO2 Gas Sensor
|
||||||
|
|
||||||
## What is Arduino?
|
## What is Arduino?
|
||||||
|
|
||||||
<Missing Arduino graphic>
|
\center{\includegraphics[width=0.75\textwidth]{images/arduino-annotated.png}}
|
||||||
|
|
||||||
It's a kit (on a board) with the bare minimum components to easily use the $\mu$C
|
It's a kit (on a board) with the bare minimum components to easily use the $\mu$C
|
||||||
hardware. They do the basic, boring design needed for any board, so users only
|
hardware. They do the basic, boring design needed for any board, so users only
|
||||||
|
@ -101,11 +57,14 @@ need to add the neat stuff.
|
||||||
|
|
||||||
The Arduino folks also adapted an *Integrated Development Environment*
|
The Arduino folks also adapted an *Integrated Development Environment*
|
||||||
(IDE) to their boards. This IDE allows us to easily write programs for
|
(IDE) to their boards. This IDE allows us to easily write programs for
|
||||||
their boards and then write the programs to the $\mu$C.
|
their boards and then transfer the programs to the $\mu$C.
|
||||||
|
|
||||||
\Large Get the Arduino IDE:
|
\Large Get the Arduino IDE:
|
||||||
[https://www.arduino.cc/en/Main/Software](https://www.arduino.cc/en/Main/Software)
|
[https://www.arduino.cc/en/Main/Software](https://www.arduino.cc/en/Main/Software)
|
||||||
|
|
||||||
|
Get the libraries and sample code for this workshop:
|
||||||
|
[https://monadnock.ca/lts-workshop-Nov2017.zip](https://monadnock.ca/lts-workshop.zip)
|
||||||
|
|
||||||
<!-- ## Installation -->
|
<!-- ## Installation -->
|
||||||
|
|
||||||
<!-- \Large Get installing -->
|
<!-- \Large Get installing -->
|
||||||
|
@ -240,7 +199,7 @@ Can be a:
|
||||||
* Batteries
|
* Batteries
|
||||||
* Solar Panel
|
* Solar Panel
|
||||||
|
|
||||||
In our circuits, your laptop is converting it's power source to $\SI{5}{\volt}$ and
|
In our circuits, your computer is converting it's power source to $\SI{5}{\volt}$ and
|
||||||
delivering power to our circuit via USB.
|
delivering power to our circuit via USB.
|
||||||
|
|
||||||
## $\mu$Controller
|
## $\mu$Controller
|
||||||
|
@ -279,7 +238,7 @@ repeat^[some commands change the address of the next fetched command]
|
||||||
|
|
||||||
Most of the pins on the Arduino can be set for INPUT or OUTPUT mode.
|
Most of the pins on the Arduino can be set for INPUT or OUTPUT mode.
|
||||||
|
|
||||||
- INPUT mode pins listen for a signal ($0$ or $1$) from another device
|
- INPUT mode pins listen for a signal (High or Low) from another device
|
||||||
- OUTPUT mode pins drive the pin High or Low
|
- OUTPUT mode pins drive the pin High or Low
|
||||||
|
|
||||||
## Floating Pins
|
## Floating Pins
|
||||||
|
@ -314,14 +273,24 @@ will not flow and the LED is off.
|
||||||
* Board: Arduino/Genuino UNO
|
* Board: Arduino/Genuino UNO
|
||||||
* Port: \ldots
|
* Port: \ldots
|
||||||
|
|
||||||
<!-- ## Fetch the Class Code -->
|
## Fetch the Class Code
|
||||||
|
|
||||||
<!-- - Download and extract: [https://nocko.se/assets/arduino-medway.zip](https://nocko.se/assets/arduino-medway.zip) -->
|
Download and extract: [https://monadnock.ca/static/lts-workshop-Nov2017.zip](https://monadnock.ca/static/lts-workshop-Nov2017.zip)
|
||||||
<!-- - File$\rightarrow$Preferences -->
|
|
||||||
<!-- - Browse for sketchbook -->
|
- File$\rightarrow$Preferences
|
||||||
<!-- - Point it at the `sketchbook` subfolder of the extracted download -->
|
- Browse for sketchbook
|
||||||
<!-- - You should now see a list of projects in the -->
|
- Point it at the `sketchbook` subfolder of the extracted download
|
||||||
<!-- File$\rightarrow$Sketchbook menu. -->
|
- You should now see a list of projects in the
|
||||||
|
File$\rightarrow$Sketchbook menu.
|
||||||
|
|
||||||
|
## Setup the Sensor Libraries (Sketchbook)
|
||||||
|
|
||||||
|
\begin{center}
|
||||||
|
\includegraphics[width=0.5\textwidth]{images/preferences.png}
|
||||||
|
\includegraphics[width=0.5\textwidth]{images/preferences2.png}
|
||||||
|
\end{center}
|
||||||
|
|
||||||
|
For the *Sketchbook Location* browse to the extracted lts-workshop-Nov2017/sketchbook directory.
|
||||||
|
|
||||||
## The Code Environment
|
## The Code Environment
|
||||||
|
|
||||||
|
@ -349,12 +318,13 @@ void loop() {
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
# Add Some Parts
|
# Lets Add Some Parts
|
||||||
|
|
||||||
## Breadboard
|
## Breadboard
|
||||||
|
|
||||||
![Breadboard](images/breadboard.png)\
|
![Breadboard](images/breadboard.png)\
|
||||||
|
|
||||||
|
|
||||||
- Connectors gently pinch component leads, wires.
|
- Connectors gently pinch component leads, wires.
|
||||||
- Have internal connections
|
- Have internal connections
|
||||||
|
|
||||||
|
@ -364,25 +334,28 @@ We use the long rows to distribute power. The Arduino outputs
|
||||||
$\SI{5}{\volt}$ on the pin marked `5V`, the reference (GND) is marked
|
$\SI{5}{\volt}$ on the pin marked `5V`, the reference (GND) is marked
|
||||||
`GND`.
|
`GND`.
|
||||||
|
|
||||||
![Arduino + Breadboard](images/bb+uno.png)
|
|
||||||
|
|
||||||
## Buzzer & Button: Hardware
|
|
||||||
|
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\includegraphics[width=0.98\textwidth]{images/buzzer-breadboard.png}
|
\includegraphics[width=0.92\textwidth]{images/rails.png}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
## Push Button: Zoom
|
## DHT11: Temperature and Humidity Sensor
|
||||||
|
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\includegraphics[width=0.98\textwidth]{images/bb+switch+zoom.png}
|
\includegraphics[width=0.98\textwidth]{images/dht11-wide.png}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
|
|
||||||
|
## DHT11: Zoom
|
||||||
|
|
||||||
|
\begin{center}
|
||||||
|
\includegraphics[width=0.25\textwidth]{images/dht11-zoom.png}
|
||||||
|
\end{center}
|
||||||
|
|
||||||
|
Connect left pin to Vcc rail ($+$) and right pin to GND ($-$) rail. Second from left connects to Arduino pin #2 *and* a resistor to Vcc
|
||||||
|
|
||||||
## Pullup / Pulldown Resistors
|
## Pullup / Pulldown Resistors
|
||||||
|
|
||||||
Reading a floating pin is **bad**. A switch only connects
|
The DHT11 uses an *Open Collector* output that switches between *Not Connected* and *Connected to Ground*. When it's not connected, the pin is left *floating*. How do we make a floating pin look like a High signal?
|
||||||
and disconnects a wire. When the wire is disconnected... the INPUT pin
|
|
||||||
is floating!
|
|
||||||
|
|
||||||
\vfill
|
\vfill
|
||||||
|
|
||||||
|
@ -391,40 +364,28 @@ is floating!
|
||||||
Connect the pin to Vcc so that it reads High; use a
|
Connect the pin to Vcc so that it reads High; use a
|
||||||
resistor to prevent short circuit (limit current).
|
resistor to prevent short circuit (limit current).
|
||||||
|
|
||||||
## Buzzer: Zoom
|
## DHT11: Run example code
|
||||||
|
|
||||||
|
We can test the sensor by running sample code from the library.
|
||||||
|
|
||||||
|
Open the sample: File$\rightarrow$Examples$\rightarrow$DHT Sensor Library$\rightarrow$DHTtester
|
||||||
|
|
||||||
|
Once the sample is loaded click the *upload* button (looks like right arrow)
|
||||||
|
|
||||||
|
## Arduino Serial Monitor
|
||||||
|
|
||||||
|
Once the sample code is uploaded, you can open the *Serial Monitor* to view the output. It can be found under:
|
||||||
|
|
||||||
|
Tools$\rightarrow$Serial Monitor
|
||||||
|
|
||||||
|
## DHTtester Output
|
||||||
|
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\includegraphics[width=0.98\textwidth]{images/buzzer-zoom.png}
|
\includegraphics[width=0.98\textwidth]{images/monitor-dht.png}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
## Buzzer / Button: Software (Part 1)
|
|
||||||
|
|
||||||
~~~ C
|
<!-- ## Programming Note: *If* Statement
|
||||||
#define BUTTON 2
|
|
||||||
#define BUZZER 8
|
|
||||||
|
|
||||||
int button_state;
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
pinMode(BUTTON, INPUT);
|
|
||||||
pinMode(BUZZER, OUTPUT);
|
|
||||||
digitalWrite(BUZZER, LOW); /* Start w/ LED off */
|
|
||||||
}
|
|
||||||
~~~
|
|
||||||
## Programming Note: Variables
|
|
||||||
|
|
||||||
Declare a variable:
|
|
||||||
|
|
||||||
~~~ C
|
|
||||||
int button_state = HIGH;
|
|
||||||
~~~
|
|
||||||
|
|
||||||
`<type> <name> [= <initial value>];` (value optional)
|
|
||||||
|
|
||||||
It's a name, like a preprocessor `#define`, but the value can change
|
|
||||||
at *runtime*
|
|
||||||
|
|
||||||
## Programming Note: *If* Statement
|
|
||||||
|
|
||||||
~~~ C
|
~~~ C
|
||||||
if (condition) {
|
if (condition) {
|
||||||
|
@ -446,129 +407,207 @@ In C-like languages, the `==` operator checks if two things
|
||||||
|
|
||||||
- It returns `1` if the items are equal, *or*
|
- It returns `1` if the items are equal, *or*
|
||||||
- It returns `0` if the items are not equal
|
- It returns `0` if the items are not equal
|
||||||
|
-->
|
||||||
|
|
||||||
## Programming Note: Functions
|
## TSL2561: Ambient Light Sensor
|
||||||
|
|
||||||
Functions make it easy to reuse code. You already know / use several
|
|
||||||
functions:
|
|
||||||
|
|
||||||
- pinMode
|
|
||||||
- digitalWrite
|
|
||||||
- delay
|
|
||||||
|
|
||||||
digitalRead(pin number) returns HIGH or LOW depending on current state
|
|
||||||
of any **INPUT** pin.
|
|
||||||
|
|
||||||
You can write your own functions!
|
|
||||||
|
|
||||||
## Programming Note: Writing Functions
|
|
||||||
|
|
||||||
~~~ C
|
|
||||||
void my_function(int arg1, ...) {
|
|
||||||
// Do fun things
|
|
||||||
}
|
|
||||||
~~~
|
|
||||||
|
|
||||||
void:
|
|
||||||
: Return type. Void means nothing returned. Can be any type.
|
|
||||||
|
|
||||||
my_function:
|
|
||||||
: A name for your function
|
|
||||||
|
|
||||||
arguments:
|
|
||||||
: A type and name for any parameters you want to use in your function
|
|
||||||
from the outside.
|
|
||||||
|
|
||||||
Define a function once, you can use it again and again. Better than
|
|
||||||
copy/pasting.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Push Button: Software (Part 2)
|
|
||||||
|
|
||||||
~~~ C
|
|
||||||
void buzz(int ms) {
|
|
||||||
digitalWrite(BUZZER, HIGH);
|
|
||||||
delay(ms);
|
|
||||||
digitalWrite(BUZZER, LOW);
|
|
||||||
}
|
|
||||||
void loop() {
|
|
||||||
button_state = digitalRead(BUTTON);
|
|
||||||
if (button_state == LOW) {
|
|
||||||
buzz(100);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
~~~
|
|
||||||
|
|
||||||
# More Parts
|
|
||||||
|
|
||||||
## Potentiometer
|
|
||||||
|
|
||||||
*Puh - ten - she - ometer*
|
|
||||||
|
|
||||||
- *Pot* for short
|
|
||||||
- A Voltage Divider
|
|
||||||
- Voltage at *Wiper* is somewhere between potential at the two
|
|
||||||
terminals.
|
|
||||||
- The exact wiper potential depends on the position of the knob/lever.
|
|
||||||
|
|
||||||
## ADC: Analog to Digital Converter
|
|
||||||
|
|
||||||
- A peripheral of the $\mu$Controller
|
|
||||||
- Measures Potential, outputs a number
|
|
||||||
- In our case, $\SI{0}{\volt}\rightarrow0$ and
|
|
||||||
$\SI{5}{\volt}\rightarrow1023$
|
|
||||||
- A0-A5 pins on Arduino can be used
|
|
||||||
- Fun uses: Reading pot position, sampling audio, reading from sensors
|
|
||||||
|
|
||||||
## The Pot Hookup
|
|
||||||
|
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\includegraphics[width=0.98\textwidth]{images/bb+switch+pot.png}
|
\includegraphics[width=0.98\textwidth]{images/tsl2561-wide.png}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
Connect center pin to `A0`, outer pins to ($+$) and ($-$) rails
|
## TSL2561: Zoom
|
||||||
|
|
||||||
## Pot Code
|
\begin{center}
|
||||||
|
\includegraphics[width=0.3 \textwidth]{images/tsl-zoom.png}
|
||||||
|
\end{center}
|
||||||
|
|
||||||
`analogRead(`*pin*`)` returns the voltage at the pin (0--1023), it can
|
Connect Vin to ($+$) rail, GND to ($-$) rail, SDA to Arduino pin A4 and SCL to A5
|
||||||
be used directly or via variable.
|
|
||||||
|
## TSL2561: Run example code
|
||||||
|
|
||||||
|
We can test the sensor by running sample code from the library.
|
||||||
|
|
||||||
|
Open the sample: File$\rightarrow$Examples$\rightarrow$Adafruit TSL2561$\rightarrow$sensorapi
|
||||||
|
|
||||||
|
Once the sample is loaded click the *upload* button (looks like right arrow)
|
||||||
|
|
||||||
|
## TSL2561 Sample Output
|
||||||
|
|
||||||
|
\begin{center}
|
||||||
|
\includegraphics[width=0.98\textwidth]{images/monitor-tsl.png}
|
||||||
|
\end{center}
|
||||||
|
|
||||||
|
## CCS811: Gas Sensor
|
||||||
|
|
||||||
|
\begin{center}
|
||||||
|
\includegraphics[width=0.98\textwidth]{images/CCS811-wide.png}
|
||||||
|
\end{center}
|
||||||
|
|
||||||
|
## CCS811: Zoom
|
||||||
|
|
||||||
|
\begin{center}
|
||||||
|
\includegraphics[width=0.3\textwidth]{images/ccs11-zoom.png}
|
||||||
|
\end{center}
|
||||||
|
|
||||||
|
*Vin* to ($+$) rail, GND *and* WAKE to ($-$) rail, SDA to TSL2561 SDA, SCL to TSL2561 SCL
|
||||||
|
|
||||||
|
## CCS811: Run example code
|
||||||
|
|
||||||
|
We can test the sensor by running sample code from the library.
|
||||||
|
|
||||||
|
Open the sample: File$\rightarrow$Examples$\rightarrow$Adafruit CCS811 Library$\rightarrow$CCS811_test
|
||||||
|
|
||||||
|
Once the sample is loaded click the *upload* button (looks like right arrow)
|
||||||
|
|
||||||
|
## CCS811 Sample Output
|
||||||
|
|
||||||
|
\begin{center}
|
||||||
|
\includegraphics[width=0.98\textwidth]{images/monitor-ccs.png}
|
||||||
|
\end{center}
|
||||||
|
|
||||||
|
# Programming
|
||||||
|
|
||||||
|
## Part 1; Includes
|
||||||
|
|
||||||
~~~ C
|
~~~ C
|
||||||
#define LED 13
|
#include <Wire.h>
|
||||||
|
#include <Adafruit_Sensor.h>
|
||||||
|
#include <Adafruit_TSL2561_U.h>
|
||||||
|
#include "Adafruit_CCS811.h"
|
||||||
|
#include "DHT.h"
|
||||||
|
~~~
|
||||||
|
|
||||||
|
## Part 2; Definitions
|
||||||
|
|
||||||
|
~~~ C
|
||||||
|
#define DHTPIN 2
|
||||||
|
#define DHTTYPE DHT11
|
||||||
|
~~~
|
||||||
|
|
||||||
|
## Part 3; Objects
|
||||||
|
~~~ C
|
||||||
|
Adafruit_CCS811 ccs;
|
||||||
|
DHT dht(DHTPIN, DHTTYPE);
|
||||||
|
Adafruit_TSL2561_Unified tsl =
|
||||||
|
Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);
|
||||||
|
~~~
|
||||||
|
|
||||||
|
## Programming Note: Variables
|
||||||
|
|
||||||
|
Declare a variable:
|
||||||
|
|
||||||
|
~~~ C
|
||||||
|
int button_state = HIGH;
|
||||||
|
~~~
|
||||||
|
|
||||||
|
`<type> <name> [= <initial value>];` (value optional)
|
||||||
|
|
||||||
|
It's a name, like a preprocessor `#define`, but the value can change
|
||||||
|
at *runtime*
|
||||||
|
|
||||||
|
## Part 4; Setup
|
||||||
|
~~~ C
|
||||||
void setup() {
|
void setup() {
|
||||||
pinMode(LED, OUTPUT);
|
Serial.begin(9600);
|
||||||
|
Serial.println("Let's Talk Science!");
|
||||||
|
|
||||||
|
dht.begin();
|
||||||
|
ccs.begin();
|
||||||
|
tsl.begin();
|
||||||
|
|
||||||
|
while(!ccs.available());
|
||||||
|
float temp = ccs.calculateTemperature();
|
||||||
|
ccs.setTempOffset(temp - 25.0);
|
||||||
|
|
||||||
|
tsl.enableAutoRange(true);
|
||||||
|
tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS);
|
||||||
}
|
}
|
||||||
void loop() {
|
|
||||||
digitalWrite(LED, HIGH);
|
~~~
|
||||||
delay(analogRead(A0));
|
|
||||||
digitalWrite(LED, LOW);
|
|
||||||
delay(analogRead(A0));
|
## Part 4; Main Loop
|
||||||
|
|
||||||
|
~~~ C
|
||||||
|
loop () {
|
||||||
|
delay(500);
|
||||||
|
...
|
||||||
}
|
}
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
Since the delay() calls use the result of analogRead (0-1023), the
|
## Part 4a; Temperature / Humity Sensor Read
|
||||||
blink rate changes with knob position.
|
|
||||||
|
|
||||||
# Shall we play a game?
|
~~~ C
|
||||||
|
loop () {
|
||||||
|
...
|
||||||
|
float humidity = dht.readHumidity();
|
||||||
|
float temp = dht.readTemperature();
|
||||||
|
|
||||||
## Hooking up a bunch of LEDs
|
Serial.print(humidity);
|
||||||
|
Serial.print(" ");
|
||||||
|
Serial.print(temp);
|
||||||
|
Serial.print(" ");
|
||||||
|
...
|
||||||
|
}
|
||||||
|
~~~
|
||||||
|
|
||||||
|
## Part 4b; Gas Sensor Read
|
||||||
|
|
||||||
|
~~~ C
|
||||||
|
loop () {
|
||||||
|
...
|
||||||
|
ccs.readData();
|
||||||
|
int co2 = ccs.geteCO2();
|
||||||
|
int tvoc = ccs.getTVOC();
|
||||||
|
|
||||||
|
Serial.print(co2/100);
|
||||||
|
Serial.print(" ");
|
||||||
|
Serial.print(tvoc/10);
|
||||||
|
Serial.print(" ");
|
||||||
|
}
|
||||||
|
~~~
|
||||||
|
|
||||||
|
## Part 4c; Light Sensor Read
|
||||||
|
|
||||||
|
~~~ C
|
||||||
|
loop () {
|
||||||
|
...
|
||||||
|
sensors_event_t event;
|
||||||
|
tsl.getEvent(&event);
|
||||||
|
|
||||||
|
Serial.print(event.light/10);
|
||||||
|
...
|
||||||
|
}
|
||||||
|
~~~
|
||||||
|
|
||||||
|
## Part 4d; Ending the output
|
||||||
|
|
||||||
|
~~~ C
|
||||||
|
loop () {
|
||||||
|
...
|
||||||
|
Serial.println("");
|
||||||
|
}
|
||||||
|
~~~
|
||||||
|
|
||||||
|
## Complete Sensor Output
|
||||||
|
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\includegraphics[width=0.65\textwidth]{images/bb+switch+pot+leds.png}
|
\includegraphics[width=0.98\textwidth]{images/monitor-all.png}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
## LEDs, the first one
|
## Arduino Serial Plotter
|
||||||
|
|
||||||
Looks complicated, but for each LED: The short leg goes to ground, the
|
Why such a terse, boring output format?
|
||||||
long leg goes to one end of a resistor, and the other end of the
|
|
||||||
resistor goes to the arduino pin.
|
Arduino has a feature where it will plot data in this specific format. You can see the plotted output by closing the Arduino Serial Monitor and Opening *Arduino Serial Plotter* (Tools$\rightarrow$Serial Plotter)
|
||||||
|
|
||||||
|
## Arduino Serial Plotter Output
|
||||||
|
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\includegraphics[width=0.55\textwidth]{images/one-led.png}
|
\includegraphics[width=0.98\textwidth]{images/plotter.png}
|
||||||
\end{center}
|
\end{center}
|
||||||
|
|
||||||
## Programming Note: `for` Loop
|
<!-- ## Programming Note: `for` Loop
|
||||||
|
|
||||||
~~~ C
|
~~~ C
|
||||||
for ( initializer ; condition; increment ) {
|
for ( initializer ; condition; increment ) {
|
||||||
|
@ -618,9 +657,9 @@ void loop () {
|
||||||
delay(delay_ms);
|
delay(delay_ms);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
~~~
|
~~~ -->
|
||||||
|
|
||||||
## Programming Note: `while` Loop
|
<!-- ## Programming Note: `while` Loop
|
||||||
|
|
||||||
~~~ C
|
~~~ C
|
||||||
while ( statement ) {
|
while ( statement ) {
|
||||||
|
@ -639,9 +678,9 @@ condition
|
||||||
increment
|
increment
|
||||||
: Runs *after* each loop. Often used to increment variables.
|
: Runs *after* each loop. Often used to increment variables.
|
||||||
|
|
||||||
\center{*All fields are optional*}
|
\center{*All fields are optional*} -->
|
||||||
|
|
||||||
## Winner, Winner, Chicken Dinner
|
<!-- ## Winner, Winner, Chicken Dinner
|
||||||
|
|
||||||
~~~ C
|
~~~ C
|
||||||
#define WINNER 5
|
#define WINNER 5
|
||||||
|
@ -700,9 +739,28 @@ loop () {
|
||||||
check_delay(i, delay_ms);
|
check_delay(i, delay_ms);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
~~~
|
~~~ -->
|
||||||
|
|
||||||
# The End?
|
# Undiscussed Issues
|
||||||
|
|
||||||
|
## Obtaining the kit
|
||||||
|
|
||||||
|
- Educators would need to order several different parts (SKUs).
|
||||||
|
- Vendors keep very little stock (~4 dozen).
|
||||||
|
- Educators may need to "google around" to find parts, most likely from abroad (US or China)
|
||||||
|
|
||||||
|
## Installing the Software
|
||||||
|
|
||||||
|
- School machines may prevent software installation
|
||||||
|
- School machines may not be conventional computers (iPads, Chromebooks)
|
||||||
|
|
||||||
|
## Troubleshooting the Build
|
||||||
|
|
||||||
|
- Breadboards aren't rugged.
|
||||||
|
- Sockets wear out quickly
|
||||||
|
- Parts may need to be wiggled
|
||||||
|
- Some parts may be DoA
|
||||||
|
- Most troubleshooting requires a Multimeter (and training on how to use it)
|
||||||
|
|
||||||
# Extra Credit
|
# Extra Credit
|
||||||
## Ohm's Law
|
## Ohm's Law
|
||||||
|
|