IDS KIT
THIS PAGE IS A BETA VERSION - ERRORS MAY OCCUR
write to mads@hobye.dk if you find any - based on this repository: https://github.com/InteractiveDigitalSystems
Getting started // setting up the board
Setting up ESP32 for the first time requires you to install the neccesary libraries, probably usb drivers (cp2102). Have a look at the links behov for instructions:
Generic setup for ESP32: https://learn.hobye.dk/development/esp32/setup-the-board
Specifikally for the esp32-DevKit-1 board version:
https://randomnerdtutorials.com/getting-started-with-esp32/
To upload code you need to press the reboot button.
Get the onboard LED to blink
#define ONBOARD_LED 2
void setup() {
pinMode(ONBOARD_LED,OUTPUT);
}
void loop() {
delay(1000);
digitalWrite(ONBOARD_LED,HIGH);
delay(100);
digitalWrite(ONBOARD_LED,LOW);
}
Get a LED to blink
The resistor is not a requirement for testing - you can connect it directly. If you are making a permanent installation it is neccesary for preventing the LED to burn out quickly.
#define LED_PIN 23
void setup() {
pinMode(LED_PIN,OUTPUT);
}
void loop() {
delay(1000);
digitalWrite(LED_PIN,HIGH);
delay(100);
digitalWrite(LED_PIN,LOW);
}
dim led see her: https://randomnerdtutorials.com/esp32-pwm-arduino-ide/
Dim the led
#define LED_PIN 23
// setting PWM properties
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
void setup() {
// configure LED PWM functionalitites
ledcSetup(ledChannel, freq, resolution);
// attach the channel to the GPIO to be controlled
ledcAttachPin(LED_PIN, ledChannel);
}
void loop() {
ledcWrite(ledChannel, 155);
delay(1000);
ledcWrite(ledChannel, 255);
delay(1000);
}
dim led see her: https://randomnerdtutorials.com/esp32-pwm-arduino-ide/
Dim with potmeter
#define LED_PIN 23
// setting PWM properties
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
void setup() {
// configure LED PWM functionalitites
ledcSetup(ledChannel, freq, resolution);
// attach the channel to the GPIO to be controlled
ledcAttachPin(LED_PIN, ledChannel);
Serial.begin(9600);
}
void loop() {
// Serial.println();
ledcWrite(ledChannel, analogRead(26)/16);
}
dim led see her: https://randomnerdtutorials.com/esp32-pwm-arduino-ide/
Push button
A push button is a simple way to create interaction. It can be used to create different outputs depending on the length of the push, the amount of pushes, etc.
Attach one wire from the button to a digital pin (in the example we have used digital pin 3), and the other to ground. To test the circuit, use the following code:
void setup() {
pinMode(25, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
boolean btnPressed = !digitalRead(25);
if(btnPressed == true) {
Serial.println("button has been pressed.");
}
}
Button event
boolean btnPressedOld = false;
void setup() {
pinMode(25, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
boolean btnPressed = !digitalRead(25);
if (btnPressedOld == false)
{
if (btnPressed == true) {
Serial.println("button has been pressed.");
delay(100);
}
}
btnPressedOld = btnPressed;
}
Toggle the onboard led on/off
boolean btnPressedOld = false;
boolean toggleOn = false;
#define ONBOARD_LED 2
void setup() {
pinMode(25, INPUT_PULLUP);
Serial.begin(9600);
pinMode(ONBOARD_LED,OUTPUT);
}
void loop() {
boolean btnPressed = !digitalRead(25);
if (btnPressedOld == false)
{
if (btnPressed == true) {
toggleOn = !toggleOn;
Serial.println("button has been pressed.");
Serial.println(toggleOn);
delay(100);
}
}
digitalWrite(ONBOARD_LED,toggleOn);
btnPressedOld = btnPressed;
}
Count the number of presses
boolean btnPressedOld = false;
int btnCounterPressed = 0;
void setup() {
pinMode(25, INPUT_PULLUP);
Serial.begin(9600);
btnCounterPressed = 0;
}
void loop() {
boolean btnPressed = !digitalRead(25);
if (btnPressedOld == false)
{
if (btnPressed == true) {
Serial.println("button has been pressed.");
btnCounterPressed++;
Serial.println(btnCounterPressed);
delay(100);
}
}
btnPressedOld = btnPressed;
}
Potentiometer
A potentiometer is a mechanical device providing a resistance, which can be read as an analogue value using Arduino. When the knob of the potentiometer is turned, the amount of resistance varies, creating increasing and decreasing values. This can be used the same way we use knobs on e.g. speakers to turn up or down the volume.
The three wires of the potentiometer go to ground, 5v and one of the analogue pins (in this example A0).
Use this code to read the value in the serial monitor:
int potPin =26;
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(potPin);
Serial.println(sensorValue);
delay(1);
}
For using a piezo as a buzzer look here
https://esp32io.com/tutorials/esp32-button-piezo-buzzer
Piezo - as a knock sensor
The Piezo is a sensor which produces AC voltage when in movement. It can be used both as a source of input and output. It creates input when moved, flickered or shaken (could be by the knock of a hand, by a sound wave, etc.) and can be used for interactions where differing intensities or types of movement gives different outputs.
Connect ground to ground and power to analog pin 0, using a 1 M ohm resistor (breadboard is optional).
Use the following code to read the values (ADC) and convert into voltage:
const int PIEZO_PIN = 26;
void setup() {
Serial.begin(9600);
}
void loop() {
int piezoADC = analogRead(PIEZO_PIN);
float piezoV = piezoADC / 1023.0 * 5.0;
Serial.println(piezoV);
}
You have already been presented to the int and boolean variables. Read here for more information about the float variable, or here for the const variable.
OBS! For using analog input you can ONLY use the pins with an ADC channel AND if you plan to use WIFI then you need to use a pin with ADC1. When you use WIFI, ADC2 will be disabled.
Use a joystick
The joystick is a combination of one button and two potentiometers.
const int BTN_PIN = 27;
const int VER_PIN = 12;
const int HOR_PIN = 14;
void setup() {
Serial.begin(9600);
pinMode(BTN_PIN, INPUT);
}
void loop() {
Serial.println(digitalRead(BTN_PIN));
Serial.println(analogRead(VER_PIN));
Serial.println(analogRead(HOR_PIN));
}
Warning the order on the black joystick button is different. On the black joystick the
GND = GND
V5 = VCC = 3x3V
VRX = HOR
VRY= VER
SW = SEL
MPU: Sensing movement and direction
The MPU is a version of an IMU (inertia measurement unit) sensor, which can measure three-dimensional movement and positions. The MPU is a combination of an accelerometer (measures gravitational acceleration) and a gyroscope (measures rotational velocity).
Install the library “MPU6050” by Adafruit – it might ask you to install a series of other libraries in order for this to run.
Go to – File – Examples – Adafruit MPU6050 – and chose the example called “plotter” in order to read the values from the accelerometer in the serial plotter.
You need to install the MPU6050_tockn library
#include <MPU6050_tockn.h>
#include <Wire.h>
MPU6050 mpu6050(Wire);
void setup() {
Serial.begin(9600);
Wire.begin();
mpu6050.begin();
mpu6050.calcGyroOffsets(true);
}
void loop() {
mpu6050.update();
Serial.print("angleX : ");
Serial.print(mpu6050.getAngleX());
Serial.print("\tangleY : ");
Serial.print(mpu6050.getAngleY());
Serial.print("\tangleZ : ");
Serial.println(mpu6050.getAngleZ());
}
Before displaying text on the LCD, you need to find the LCD I2C address. So follow this guide to set it up properly:
https://iotbyhvm.ooo/i2c-lcd-esp32-arduino-ide/
https://randomnerdtutorials.com/esp32-ssd1306-oled-display-arduino-ide/
http://www.getmicros.net/esp8266-and-128-x-32-oled-example.php
RGB LED
https://esp32io.com/tutorials/esp32-rgb-led