Оглавление:
- Шаг 1: Необходимые материалы и детали:
- Шаг 2: Неопиксельные кольца
- Шаг 3: Подключения
- Шаг 4: Код:
- Шаг 5: Собираем все вместе:
Видео: Очки для релаксации - ITTT: 5 шагов (с изображениями)
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:53
Проект HKU - ITTT (If This Then That) - Юлия Беркувер, 1B
Вы когда-нибудь испытывали стресс и просто не знали, как себя успокоить, тогда вам стоит попробовать эти расслабляющие очки! Вы надеваете их и закрываете глаза, тогда заиграет паттерн дыхания. Следуя этому образцу дыхания, ваш ритм дыхания снизится до вдоха и выдоха 6 раз в минуту. Таким образом снимается дневной стресс.
Вы также можете отслеживать интенсивность дыхания, щелкнув переключатель с помощью датчика FSR.
В этом туториале я шаг за шагом проведу вас через создание ваших собственных очков для релаксации.
Шаг 1: Необходимые материалы и детали:
Материалы:
1x arduino uno;
1x макет или PCV;
3 резистора по 10 кОм
Провода (желательно разных цветов, чтобы было легче понять, какие предметы идут на землю, а какие - на разные контакты и т. Д.);
Некоторые термоусадочные трубки;
2x NeoPixel Ring - 16 x 5050 RGB светодиодов со встроенными драйверами;
1x переключатель;
1x датчик FSR;
1x очки SteamPunk (вы можете купить их в магазине для вечеринок, они просты в использовании, потому что кольцо из неопикселя идеально подходит для очков. Вы всегда пытаетесь использовать другие очки или создать свои собственные);
1x какой-то (эластичный) ремешок, который можно обернуть вокруг груди.
Инструменты: -Ноутбук
-Паяльник
-Программное обеспечение Arduino IDE
Вы увидите две кнопки и переключатель на моем пвх, я использую только левую кнопку, чтобы подключить его к переключателю, я не использую вторую кнопку справа от изображения. Я положил кнопки на ПВХ, прежде чем понял, что они мне не нужны, и вместо этого мне нужно было использовать переключатель.
Ниже вы увидите фотографии всего, что я использовал:
Шаг 2: Неопиксельные кольца
Белый провод соединен с землей на обратной стороне кольца neopixel.
Оранжевый провод подключен к 5В.
Коричневый провод подключается ко входу данных.
Шаг 3: Подключения
Так выглядела моя макетная плата во время создания прототипа, вы можете использовать это как образец.
Я также сделал схему разводки того, как она должна выглядеть с помощью всего одной кнопки.
Шаг 4: Код:
Это, наверное, не самый эффективный код, но у меня он работает. Бросьте себе вызов и постарайтесь сделать его более эффективным; P
#включают
// Который
контакт на Arduino подключен к NeoPixels?
#определять
ПИН 6
// Который
пин на Arduino подключен к кнопке
#определять
BUTTON_PIN 9
// Как
много NeoPixels прикреплено к Arduino?
#определять
ЧИСЛО 16
// Когда
мы настраиваем библиотеку NeoPixel, мы сообщаем ей, сколько пикселей и какой вывод использовать для отправки сигналов.
// Примечание
что для старых полосок NeoPixel вам может потребоваться изменить третий параметр - см. Strandtest
//
пример для получения дополнительной информации о возможных значениях.
Adafruit_NeoPixel
пикселей = Adafruit_NeoPixel (NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int pause
= 1; // delay2
int
pause2 = 80; // опускаемся, когда используется fsr
int
pause3 = 150; // работаем, когда используется fsr
int
delayval = 4; // задержка1
int
fsrPin = 0; // FSR и 10K pullldown подключены к a0
int
fsrReading;
пустота
настраивать() {
pinMode (BUTTON_PIN, INPUT);
Serial.begin (9600);
pixel.begin (); // Это инициализирует
Библиотека NeoPixel.
pixel.show ();
}
bool
buttonpressed (int pin) {
вернуть digitalRead (пин);
}
пустота
loop () {// считывает, является ли ввод пина истинным или ложным
fsrReading = analogRead (fsrPin);
Serial.print ("Аналоговое чтение =");
Serial.print (fsrReading);
if (кнопка нажата (BUTTON_PIN) == true) {
// световой эффект при использовании датчика fsr
if (fsrReading> 50) {
пикселей.setPixelColor (0, 1, 0, 1);
пикселей.setPixelColor (15, 1, 0, 1);
пикселей.setPixelColor (1, 1, 0, 1);
пикселей.setPixelColor (14, 1, 0, 1);
pixel.show ();
задержка (пауза3);
}
if (fsrReading <52) {
пикселей.setPixelColor (0, 0, 0, 0);
пикселей.setPixelColor (15, 0, 0, 0);
пикселей.setPixelColor (1, 0, 0, 0);
пикселей.setPixelColor (14, 0, 0, 0);
pixel.show ();
задержка (пауза2);
}
if (fsrReading> 57) {
пикселей.setPixelColor (2, 1, 0, 1);
пикселей.setPixelColor (13, 1, 0, 1);
пикселей.setPixelColor (3, 1, 0, 1);
пикселей.setPixelColor (12, 1, 0, 1);
pixel.show ();
задержка (пауза3);
}
if (fsrReading <59) {
пикселей.setPixelColor (2, 0, 0, 0);
пикселей.setPixelColor (13, 0, 0, 0);
пикселей.setPixelColor (3, 0, 0, 0);
пикселей.setPixelColor (12, 0, 0, 0);
pixel.show ();
задержка (пауза2);
}
if (fsrReading> 65) {
пикселей.setPixelColor (4, 1, 0, 1);
пикселей.setPixelColor (11, 1, 0, 1);
пикселей.setPixelColor (5, 1, 0, 1);
пикселей.setPixelColor (10, 1, 0, 1);
pixel.show ();
задержка (пауза3);
}
if (fsrReading <67) {
пикселей.setPixelColor (4, 0, 0, 0);
пикселей.setPixelColor (11, 0, 0, 0);
пикселей.setPixelColor (5, 0, 0, 0);
пикселей.setPixelColor (10, 0, 0, 0);
pixel.show ();
задержка (40);
}
if (fsrReading> 79) {
пикселей.setPixelColor (6, 1, 0, 1);
пикселей.setPixelColor (9, 1, 0, 1);
пикселей.setPixelColor (7, 1, 0, 1);
пикселей.setPixelColor (8, 1, 0, 1);
pixel.show ();
задержка (пауза3);
}
if (fsrReading <85) {
пикселей.setPixelColor (6, 0, 0, 0);
пикселей.setPixelColor (9, 0, 0, 0);
пикселей.setPixelColor (7, 0, 0, 0);
пикселей.setPixelColor (8, 0, 0, 0);
pixel.show ();
задержка (20);
}
}
еще{
дышать_blue (20, 100, 0, 1, 1); // обычный
эффект
}
}
// Пауза
= задержка между переходами
// Шаги
= количество шагов
// R, G, B = Полные значения RGB
// Дыхание пустоты не имеет большого эффекта, как и
fsrsensor niet gebruikt wordt. Deze void wordt в de void loop () weer aangeroepen.
void Breathe_blue (int pause, int steps, byte R, byte G, byte B) {
int
tmpR, tmpG, tmpB; // Значения температуры
// Растворяться
for (int s = 1; s <= steps; s ++) {
tmpR = (R * s) /
шаги; // Сначала умножьте, чтобы избежать ошибок усечения
tmpG = (G * s) / шаги;
tmpB = (B * s) / шаги;
для (int i = 0;
япикселей.setPixelColor (0, tmpR, tmpG + 1, tmpB);
пикселей.setPixelColor (15, tmpR, tmpG + 1, tmpB);
}
pixel.show ();
задержка (4);
}
// Растворяться
for (int s = 1; s <= steps; s ++) {
tmpR = (R * s) /
шаги; // Сначала умножьте, чтобы избежать ошибок усечения
tmpG = (G * s) / шаги;
tmpB = (B * s) / шаги;
для (int i = 0;
япикселей.setPixelColor (1, tmpR, tmpG + 1, tmpB);пикселей.setPixelColor (14, tmpR, tmpG + 1, tmpB);
}
pixel.show ();
задержка (4);
}
// Растворяться
for (int s = 1; s <= steps; s ++) {
tmpR = (R * s) /
шаги; // Сначала умножьте, чтобы избежать ошибок усечения
tmpG = (G * s) / шаги;
tmpB = (B * s) / шаги;
для (int i = 0;
япикселей.setPixelColor (2, tmpR, tmpG + 2, tmpB);пикселей.setPixelColor (13, tmpR, tmpG + 2, tmpB);
}
pixel.show ();
задержка (3.5);
}
// Растворяться
for (int s = 1; s <= steps; s ++) {
tmpR = (R * s) /
шаги; // Сначала умножьте, чтобы избежать ошибок усечения
tmpG = (G * s) / шаги;
tmpB = (B * s) / шаги;
для (int i = 0;
япикселей.setPixelColor (3, tmpR, tmpG + 3, tmpB + 5);пикселей.setPixelColor (12, tmpR, tmpG + 3, tmpB + 5);
}
pixel.show ();
задержка (3);
}
для (int i = 0;
япикселей.setPixelColor (0, 0, 0, 0);пикселей.setPixelColor (15, 0, 0, 0);
}
// Растворяться
for (int s = 1; s <= steps; s ++) {
tmpR = (R * s) /
шаги; // Сначала умножьте, чтобы избежать ошибок усечения
tmpG = (G * s) / шаги;
tmpB = (B * s) / шаги;
для (int i = 0;
я
пикселей.setPixelColor (4, tmpR, tmpG + 3, tmpB + 15);пикселей.setPixelColor (11, tmpR, tmpG + 3, tmpB + 15);
}
pixel.show ();
задержка (3);
}
// Растворяться
for (int s = 1; s <= steps; s ++) {
tmpR = (R * s) /
шаги; // Сначала умножьте, чтобы избежать ошибок усечения
tmpG = (G * s) / шаги;
tmpB = (B * s) / шаги;
для (int i = 0;
япикселей.setPixelColor (5, tmpR, tmpG + 4, tmpB + 20);пикселей.setPixelColor (10, tmpR, tmpG + 4, tmpB + 20);
}
pixel.show ();
задержка (2);
}
для (int i = 0;
япикселей.setPixelColor (1, 0, 0, 0);
пикселей.setPixelColor (14, 0, 0, 0);
}
// Растворяться
for (int s = 1; s <= steps; s ++) {
tmpR = (R * s) /
шаги; // Сначала умножьте, чтобы избежать ошибок усечения
tmpG = (G * s) / шаги;
tmpB = (B * s) / шаги;
для (int i = 0;
япикселей.setPixelColor (6, tmpR, tmpG + 2, tmpB + 40);
пикселей.setPixelColor (9, tmpR, tmpG + 2, tmpB + 40);
}
pixel.show ();
задержка (delayval);
}
для (int i = 0;
япикселей.setPixelColor (2, 0, 0, 0);пикселей.setPixelColor (13, 0, 0, 0);
}
// Растворяться
for (int s = 1; s <= steps; s ++) {
tmpR = (R * s) /
шаги; // Сначала умножьте, чтобы избежать ошибок усечения
tmpG = (G * s) / шаги;
tmpB = (B * s) / шаги;
для (int i = 0;
я
пикселей.setPixelColor (7, tmpR, tmpG, tmpB + 44);пикселей.setPixelColor (8, tmpR, tmpG, tmpB + 44);
}
pixel.show ();
задержка (delayval);
}
// Угасание
for (int s = steps; s> 0; s--) {
tmpR = (R * s) / шаги; // Сначала умножьте, чтобы избежать усечения
ошибки
tmpG = (G * s) / шаги;
tmpB = (B * s) / шаги;
для (int i = 0; i
пикселей.setPixelColor (7, tmpR, tmpG, tmpB);
пикселей.setPixelColor (8, tmpR, tmpG, tmpB);
}
pixel.show ();
задержка (1);
}
// Угасание
for (int s = steps; s> 0; s--) {
tmpR = (R * s) / шаги; // Сначала умножаем, чтобы избежать усечения
ошибки
tmpG = (G * s) / шаги;
tmpB = (B * s) / шаги;
для (int i = 0; i
пикселей.setPixelColor (6, tmpR, tmpG, tmpB);
пикселей.setPixelColor (9, tmpR, tmpG, tmpB);
}
pixel.show ();
задержка (1);
}
// Угасание
for (int s = steps; s> 0; s--) {
tmpR = (R * s) / шаги; // Сначала умножьте, чтобы избежать усечения
ошибки
tmpG = (G * s) / шаги;
tmpB = (B * s) / шаги;
для (int i = 0; i
пикселей.setPixelColor (5, tmpR, tmpG, tmpB);
пикселей.setPixelColor (10, tmpR, tmpG, tmpB);
}
pixel.show ();
задержка (2);
}
// Угасание
for (int s = steps; s> 0; s--) {
tmpR = (R * s) / шаги; // Сначала умножьте, чтобы избежать усечения
ошибки
tmpG = (G * s) / шаги;
tmpB = (B * s) / шаги;
для (int i = 0; i
пикселей.setPixelColor (4, tmpR, tmpG, tmpB);
пикселей.setPixelColor (11, tmpR, tmpG, tmpB);
}
pixel.show ();
задержка (2);
}
// Угасание
for (int s = steps; s> 0; s--) {
tmpR = (R * s) / шаги; // Сначала умножьте, чтобы избежать усечения
ошибки
tmpG = (G * s) / шаги;
tmpB = (B * s) / шаги;
для (int i = 0; i
пикселей.setPixelColor (3, tmpR, tmpG, tmpB);
пикселей.setPixelColor (12, tmpR, tmpG, tmpB);
}
pixel.show ();
задержка (3);
}
// Угасание
for (int s = steps; s> 0; s--) {
tmpR = (R * s) / шаги; //
Сначала умножьте, чтобы избежать ошибок усечения
tmpG = (G * s) / шаги;
tmpB = (B * s) / шаги;
для (int i = 0; i
пикселей.setPixelColor (2, tmpR, tmpG, tmpB);
пикселей.setPixelColor (13, tmpR, tmpG, tmpB);
}
pixel.show ();
задержка (3);
}
// Угасание
for (int s = steps; s> 0; s--) {
tmpR = (R * s) / шаги; // Сначала умножаем, чтобы избежать усечения
ошибки
tmpG = (G * s) / шаги;
tmpB = (B * s) / шаги;
для (int i = 0; i
пикселей.setPixelColor (1, tmpR, tmpG, tmpB);
пикселей.setPixelColor (14, tmpR, tmpG, tmpB);
}
pixel.show ();
задержка (4);
}
// Угасание
for (int s = steps; s> 0; s--) {
tmpR = (R * s) / шаги; // Сначала умножьте, чтобы избежать усечения
ошибки
tmpG = (G * s) / шаги;
tmpB = (B * s) / шаги;
для (int i = 0; i
пикселей.setPixelColor (0, tmpR, tmpG, tmpB);
пикселей.setPixelColor (15, tmpR, tmpG, tmpB);
}
pixel.show ();
задержка (4);
}
}
Шаг 5: Собираем все вместе:
Вы можете просто оставить все свои провода подключенными к макетной плате или ПВХ, это зависит от вас (я решил поместить ПВХ поверх arduino, это красиво и аккуратно).
Следующий шаг - обернуть все провода термоусадочными трубками, чтобы не было беспорядка.
Если вы решили использовать ПВХ, то к настоящему времени должны были все спаять.
После этого вы надеваете кольца из неопикселя на внешнюю сторону очков (убедитесь, что светодиоды выровнены по низу) и закрепите их на месте с помощью скотча или клея (я использовал скотч).
Вы можете приклеить датчик FSR к резинке с помощью ленты или просто оставить его отдельно.
Наслаждайтесь очками:)
Рекомендуемые:
Очки для FPV своими руками: 6 шагов
DIY FPV Goggles: Вы когда-нибудь видели те крутые fpv-системы, которые есть у парней из flitetest. Что ж, я завидовал им за такие замечательные вещи. Я знал об ассортименте мобильных телефонов и возможностях видеозвонков, Skype или чего-то подобного. Так что я решил сделать свою в
Очки ночного видения для Google Cardboard: 10 шагов (с изображениями)
Очки ночного видения для Google Cardboard: Заявление об отказе от ответственности: использование этого устройства предназначено только для развлечений, образования и научных исследований; не для шпионажа и / или наблюдения. &Quot; Шпионский гаджет " функции были добавлены в приложение просто для развлечения и не служат практической цели для
Очки для костной проводимости Bluetooth: 7 шагов
Очки для костной проводимости Bluetooth: цель этого руководства - сделать дешевое приспособление, работающее как наушники bluetooth, использующее технологию костной проводимости, не имеющее видимых кабелей, хорошо выглядящее (по крайней мере, не делая вас похожим на киборга) и может быть установлен почти на
Наблюдение за затмением через очки для чтения (и при этом не жгучие глаза): 4 шага (с изображениями)
Наблюдение за затмением через очки для чтения (и не горящие мне глаза): Привет, я уловил ваше любопытство своим титулом? Мой отец тоже, когда мы гуляли по старому Монреальству вчера, он снял очки и показал мне, как увидеть, как увидеть затмение, с помощью своих очков для чтения. Так что все, что
Жидкокристаллические очки для амблиопии (очки для тренировки чередующейся окклюзии) [ATtiny13]: 10 шагов (с изображениями)
Жидкокристаллические очки при амблиопии (тренировочные очки с переменной окклюзией) [ATtiny13]: амблиопия (ленивый глаз), нарушение зрения, которым страдает примерно 3% населения, обычно лечится простыми повязками на глаза или каплями атропина. К сожалению, эти методы лечения закрывают более сильный глаз на длительные непрерывные периоды времени, нет