Uživatel:ThermoDream

Party teploměr

Tým

Matěj Čermák

Jakub Hein

Julie Klimentová

Darya Tsitová

Popis

Teploměr, co měří teplotu v místnosti, kde se odehrává party. Čím nižší teplota, tím vyšší rychlost hudby, aby se lidé zahřáli. To samé platí pro opačný případ - čím vyšší teplota, tím je hudba klidnější. Hudba se začne měnit se skokem zhruba dvou stupňů.Teploměr by mohl fungovat jako DJ modul a být napojen na světla - v naší mini verzi se rozsvicí různá LED světýlka. Projekt byl uskutečněn v rámci workshopu Open Hardware Studií nových médií na FF UK ( http://novamedia.ff.cuni.cz/open-hardware-2018/ ) v The Cave (https://thecave.cz/en/).

Použitý hardware a software

Arduino komponenty

Arduino UNO

TinkerKit Sensor Shield

TinkerKit PowerLED

BreadBoard

Teploměr DHT22

Green LED

Red LED

Yellow LED

Jiné komponenty

CINCH kabel 3.5mm + rozdvojka

Odkazy na knihovnu arduina

DHT sensor

https://github.com/adafruit/DHT-sensor-library

TinkerKit

https://github.com/TinkerKit/TinkerKit

TaskScheduler

https://github.com/arkhipenko/TaskScheduler

Jiné knihovny

Spotify Serial Control

http://navody.arduino-shop.cz/navody-k-produktum/teplotni-senzor-dht11.html

Použité tutoriály

https://create.arduino.cc/projecthub/Joao_Claro/arduino-beat-detector-d0a21f

http://navody.arduino-shop.cz/navody-k-produktum/teplotni-senzor-dht11.html


Vlastní zdrojový kód

include <TinkerKit.h>

include <TaskScheduler.h>

include "DHT.h"


void dhtReadCallback();

void sampleCallback();


DHT dht(3, DHT22); //DHT22 connected to pin 3


Task taskDht(15000, TASK_FOREVER, &dhtReadCallback);

Task taskSample(1, TASK_FOREVER, &sampleCallback);


Scheduler ts;


int lastState = 0;


void dhtReadCallback() {

// Read temperature as Celsius (the default)

float t = dht.readTemperature();

// Check if any reads failed and exit early (to try again).

if (!isnan(t)) {

int currentState = map(t, 15.00, 35.00, 1, 5);

if (lastState != currentState) {

Serial.println(currentState);

lastState = currentState;

}

Serial.println(t);

}

}


float bassFilter(float sample) {

static float xv[3] = {0, 0, 0}, yv[3] = {0, 0, 0};

xv[0] = xv[1]; xv[1] = xv[2];

xv[2] = (sample) / 3.f; // change here to values close to 2, to adapt for stronger or weeker sources of line level audio


yv[0] = yv[1]; yv[1] = yv[2];

yv[2] = (xv[2] - xv[0])

+ (-0.7960060012f * yv[0]) + (1.7903124146f * yv[1]);

return yv[2];

}


float envelopeFilter(float sample) { //10hz low pass

static float xv[2] = {0, 0}, yv[2] = {0, 0};

xv[0] = xv[1];

xv[1] = sample / 50.f;

yv[0] = yv[1];

yv[1] = (xv[0] + xv[1]) + (0.9875119299f * yv[0]);

return yv[1];

}


// 1.7 - 3.0hz Single Pole Bandpass IIR Filter

float beatFilter(float sample) {

static float xv[3] = {0, 0, 0},

yv[3] = {0, 0, 0};

xv[0] = xv[1]; xv[1] = xv[2];

xv[2] = sample / 2.7f;

yv[0] = yv[1]; yv[1] = yv[2];

yv[2] = (xv[2] - xv[0])

+ (-0.7169861741f * yv[0]) + (1.4453653501f * yv[1]);

return yv[2];

}


define TRESHOLD 60.0


int map2(float value, float min, float max) {

if (value<min) return 0;

if (value>max) return 255;

return map(value,min,max,0,255);

}


void sampleCallback() {

float sample = (float)analogRead(0) - 503.f;

float value = bassFilter(sample);

if (value < 0)value = -value;

value = envelopeFilter(value);

if ((taskSample.getRunCounter() % 20) == 0) {

value = beatFilter(value);


if (value < 0)value = 0;

if (value > TRESHOLD)value = TRESHOLD;


int pwm = map(value, 0, TRESHOLD, 0, 255);

analogWrite(O0, pwm);


analogWrite(9, map2(value, 0, TRESHOLD * 0.3333));

analogWrite(6, map2(value, TRESHOLD * 0.3333, TRESHOLD * 0.6666));

analogWrite(5, map2(value, TRESHOLD * 0.6666, TRESHOLD));


}


}


// defines for setting and clearing register bits

ifndef cbi

define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))

endif

ifndef sbi

define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

endif


void setup() {

// Set ADC to 77khz, max for 10bit

sbi(ADCSRA, ADPS2);

cbi(ADCSRA, ADPS1);

cbi(ADCSRA, ADPS0);


pinMode(O0, OUTPUT);

analogWrite(O0, 0);zmín


Serial.begin(115200);

dht.begin();

ts.init();

ts.addTask(taskDht);

ts.addTask(taskSample);

taskDht.enable();

taskDht.forceNextIteration();

taskSample.enable();

}


void loop() {

ts.execute();

}


Popis vývoje a konečné verze vlastního produktu

Projekt začal průzkumem možného použití komponent a poradou s vyučujícími. Následovně jsme nalezli tutoriály pro použití senzoru DHT22 a pro vytvoření detektoru BPM. Následovně bylo nutné zapojit všechny LED komponenty, aby reagovaly na hlasitost beatu. Schémata zapojení komponent můžete nalézt ve výše zmíněných tutoriálech. Závěrečnou částí bylo napogramování ovladače Spotify, který spouštěl vybrané playlisty na základě dat ze sériového portu (v našem případě škála hodnot založená na teplotě v místnosti). Ovladač byl naprogramován Janem Vlnasem pomocí jazyka JavaScript. Během projektu jsme neustále konzultovali s dalšími vyučujícím ze SNM, FF UK i The Cave.

Fotodokumentace