Uživatel:ThermoDream

ARDUINO Party teploměr

Tým

Matěj Čermák

Jakub Hein

Julie Klimentová

Darya Tsitová

Popis

Naším cílem bylo vytvořit projekt, který propojí softwarové programování a hardwarová čidla tak, aby program ovlivňoval i reálný svět okolo.

Proto jsem se rozhodli postavit jednotku, jejímž základem bude teploměr, který ve spojení s příslušným programem bude vybírat hudbu v závislosti na teplotě v místností.

Smyslem našeho nápadu byl fakt, že různí DJs takto častokrát při míchání hudby postupují sami zcela automaticky. Proto nás napadlo proces výběru hudby s ohledem na aktuální stav party zautomatizovat plně.

Pokud tedy teplota v místnosti nebezpečně stoupá, je čas tanečníky trochu uklidnit a pustit jim pomalejší hudbu, aby se party nevymkla kontrole.

Když teplota začne naopak příliš padat, nás DJ modul se pokusí tanečníky rozhýbat přehráváním rychlejšího hudby. Když se lidé tancem zahřejí, teplota by měla začít stoupat.

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. Hledali jsme cestu, jak spojit naše znalosti a HW možnosti s naším záměrem.

Původně jsme doufali v plně automatický výběr hudby, který by DJ modul realizoval prostřednictvím API ze Spotify. Modul sám by podle teploty vybíral rychlejší nebo pomalejší skladby. Teplotu by napároval s určitým hudebním stylem nebo BPM skladeb a podle toho by je vybíral.

Ukázalo se však, že takovéto propojení API je nad naše možnosti a časové dispozice kurzu. Proto jsme zvolili poloautomatické řešení. Modul v závislosti na teplotě pouští hudbu z několika playlistů, které ručně vytvoříme.

Toto řešení dává nakonec dobrý smysl. Ať už je to party taneční, rocková nebo metalová, v rukou DJ vždy zůstává možnosti předem vybrat skladby, které mají hrát. DJ modul už pak vybírá vhodný čas k jejich přehrání podle toho, jak moc aktuálně lidé tančí, a tak zvyšují nebo snižují teplotu v místnosti.

Zbývalo jen samotné naprogramování ovladače Spotify, který spouští 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.

Ohledně hardware 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.

V momentálním nastavení se hudba začne měnit při teplotním skoku zhruba o dva stupně. Teplotní rozsah a granularita pro přepnutí playlistů lze nastavovat úpravou kódu.

DJ modul je také napojen na několik diod, které blikají podle beatů v přehrávané hudbě - čím silnější beat, tím výraznější světelná odezva.

V budoucnu by DJ modul mohl být místo diod ovládat přímo světla v sále.

Během projektu jsme neustále konzultovali s dalšími vyučujícím ze SNM, FF UK i The Cave.

Fotodokumentace