Uživatel:ThermoDream: Porovnání verzí
Značka: editace z Vizuálního editoru |
|||
(Není zobrazena jedna mezilehlá verze od stejného uživatele.) | |||
Řádek 321: | Řádek 321: | ||
== Fotodokumentace == | == Fotodokumentace == | ||
+ | <gallery> | ||
+ | |||
+ | File:Foto1.jpg | ||
+ | File:Foto2.jpg | ||
+ | File:Foto3.jpg | ||
+ | File:c4.jpg | ||
+ | File:5.jpg | ||
+ | File:6.jpg | ||
+ | File:foto11.jpg | ||
+ | File:foto12.jpg | ||
+ | File:foto13.jpg | ||
+ | File:foto14.jpg | ||
+ | File:foto15.jpg | ||
+ | |||
+ | </gallery> | ||
+ | |||
+ | |||
===<nowiki/>=== | ===<nowiki/>=== |
Aktuální verze z 2. 4. 2018, 14:57
Obsah
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
- Chyba při vytváření náhledu: Soubor s rozměry většími než 12,5 MP
- Chyba při vytváření náhledu: Soubor s rozměry většími než 12,5 MP
- Chyba při vytváření náhledu: Soubor s rozměry většími než 12,5 MP
- Chyba při vytváření náhledu: Soubor s rozměry většími než 12,5 MP
- Chyba při vytváření náhledu: Soubor s rozměry většími než 12,5 MP
- Chyba při vytváření náhledu: Soubor s rozměry většími než 12,5 MP
- Chyba při vytváření náhledu: Soubor s rozměry většími než 12,5 MP
- Chyba při vytváření náhledu: Soubor s rozměry většími než 12,5 MP