
Для изготовления fidget cube нам понадобятся:
Esp8266 wemos: http://ali.pub/2i2dgk
Wemos battery shield : http://ali.pub/2q7pvt
Аккумулятор: http://ali.pub/2q7pmh
Макетные платы: http://ali.pub/2q7q6w
Переключатель: http://ali.pub/2q7p6x
Белые квадратные кнопки: http://ali.pub/2q7pb0
Кнопки: http://ali.pub/2q7pcr
Концевики: http://ali.pub/2q7pfh
Прежде чем приступить к материалу, я Вас попрошу, если нравится то, что я делаю и хотите следить за моей деятельностью, то рекомендую подписаться на мой телеграмм канал: https://t.me/ypavla
Там я публикую новости о вышедших видео, статьях и разные устройства для умного дома и не только показываю.
Спасибо за внимание, теперь продолжим.
Все наверное слышали про spinner, он же fidget spinner. Это гаджет который долго крутится, и якобы снимает стресс. Так же многие из вас слышали про fidget cube – это куб с кнопками также призван снимать стресс… Вы его вертите в руках нажимая на кнопки и тем самым успокаиваетесь.
В этой статье я покажу как сделать самостоятельно такой Куб, да еще и сделать его умным. Чтоб он отслеживал нажатия на кнопки и подсчитывал их. Тем самым можно анализировать насколько Вы нервный человек и как сильно нервничаете в разных ситуациях.
Первое что нам понадобится указано вначале статьи и собственно показано на фото ниже.

Переключатели и кнопки
Все эти концевики переключатели и кнопки можно найти или разобрать со старого сломанного оборудования, либо просто купить в магазине, ссылки на магазин вначале статьи.
Макетная плата pcb
Данных плат 6 14-14 размером, из данных плат будут состоять грани нашего куба.
Esp8266 “мозг куба”
В данном примере я использую wemos d1 mini плата построенная на esp8266
Battery shield
Это модуль для зарядки li-po аккумуляторов и преобразует 3,7v в 5v стабильного питания для wemos платы.
Аккумулятор li-po
Аккумулятор li-po литий-полимерный, с коннектором Xhr-2p 2.54
Все данные компоненты будут располагаться вот таким образом:

Плата Wemos имеет 9 контактов от D0 до D8.
D0 и D4 не могут сбрасываться при загрузке.
D8 по умолчанию отключается, поэтому не удается обнаружить нажатую кнопку с землей.
Важно!! если нажать кнопку подключенную к D3 при загрузке, то плата войдет в программный режим. У меня так и получилось, я подключил к D3 концевики и они всегда подавали сигнал нажатой кнопки, в результате esp8266 не загружалась.
Так провода припаиваются к первой кнопке “СТОРОНА 1”:

То-есть три провода, средний это земля, а два боковых будут припаиваться вместе и подключаться к одному пину esp8266
Сторона 2:

Правда тут не очень понятно) что и куда) Вот еще для примера, тут вроде понятнее)

Тут нужно землю всех кнопок связать между собой, и плюсы всех кнопок тоже связать между собой, должно получиться на выходе 2 провода.
Сторона 3:

Подключается как и сторона 2, но более понятно глазу.
Сторона 4:


В отличии от 2 стороны и от третьей, здесь будут обе кнопки работать. Поэтому в схеме подключения земля будет общая а плюсы разные у кнопок и подключаться будут к разным пинам ардуино.
Сторона 5:

Ну а здесь получается что кнопка будет якобы всегда нажата, и будет размыкаться только тогда когда мы разом на концевики нажмем на все сразу.
В итоге после совмещения сторон получится вот так:

Сам battery shield подключается к wemos вот таким образом:

Схема подключения выглядит таким образом:
Lipo Charge Board 5V -> WeMos 5V
Lipo Charge Board GND -> WeMos GND -> Все минусовые контакты всех сторон
WeMos D1 -> Сторона 2 + pin WeMos D2 -> Сторона 5 + pin WeMos D3 -> Сторона 3
trigger pin WeMos D5 -> Сторона 4
кнопка 1 WeMos D6 -> Сторона 4
кнопка 2 WeMos D7 -> Сторона 1 двумя плюсами
После подключения давайте загрузим скетч: https://yadi.sk/d/Vrk-fbfa3ae5vb
Сам скетч:
#define APSSID "Your AP name" // your network SSID (name)
#define APPASS "Your AP password" // your network password
#define CHANNELID 0 // your thingspeak channel ID
#define WRITEAPIKEY "YOURAPIKEY" // your thingspeak write API key
#define DATAMININTERVAL 15 // 15 seconds
#include "ThingSpeak.h"
// ***********************************************************************************************************
// This example selects the correct library to use based on the board selected under the Tools menu in the IDE.
// Yun, Ethernet shield, WiFi101 shield, esp8266, and MXR1000 are all supported.
// With Yun, the default is that you're using the Ethernet connection.
// If you're using a wi-fi 101 or ethernet shield (http://www.arduino.cc/en/Main/ArduinoWiFiShield), uncomment the corresponding line below
// ***********************************************************************************************************
//#define USE_WIFI101_SHIELD
//#define USE_ETHERNET_SHIELD
#if !defined(USE_WIFI101_SHIELD) && !defined(USE_ETHERNET_SHIELD) && !defined(ARDUINO_SAMD_MKR1000) && !defined(ARDUINO_AVR_YUN) && !defined(ARDUINO_ARCH_ESP8266)
#error "Uncomment the #define for either USE_WIFI101_SHIELD or USE_ETHERNET_SHIELD"
#endif
#if defined(ARDUINO_AVR_YUN)
#include "YunClient.h"
YunClient client;
#else
#if defined(USE_WIFI101_SHIELD) || defined(ARDUINO_SAMD_MKR1000) || defined(ARDUINO_ARCH_ESP8266)
// Use WiFi
#ifdef ARDUINO_ARCH_ESP8266
#include <ESP8266WiFi.h>
#else
#include <SPI.h>
#include <WiFi101.h>
#endif
char ssid[] = APSSID; // your network SSID (name)
char pass[] = APPASS; // your network password
int status = WL_IDLE_STATUS;
WiFiClient client;
#elif defined(USE_ETHERNET_SHIELD)
// Use wired ethernet shield
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
EthernetClient client;
#endif
#endif
unsigned long counter_begin_time;
int switch1_counter = 0;
int switch2a_counter = 0;
int switch2b_counter = 0;
int btngrp3_counter = 0;
int btngrp4_counter = 0;
int btngrp5_counter = 0;
int switch1_status = 1;
int switch2a_status = 1;
int switch2b_status = 1;
int btngrp3_status = 1;
int btngrp4_status = 1;
int btngrp5_status = 1;
void setup() {
Serial.begin(115200);
Serial.println("\n\nInitiating...");
pinMode(D1, INPUT_PULLUP);
pinMode(D2, INPUT_PULLUP);
pinMode(D3, INPUT_PULLUP);
pinMode(D5, INPUT_PULLUP);
pinMode(D6, INPUT_PULLUP);
pinMode(D7, INPUT_PULLUP);
#ifdef ARDUINO_AVR_YUN
Bridge.begin();
#else
#if defined(ARDUINO_ARCH_ESP8266) || defined(USE_WIFI101_SHIELD) || defined(ARDUINO_SAMD_MKR1000)
WiFi.begin(ssid, pass);
#else
Ethernet.begin(mac);
#endif
#endif
ThingSpeak.begin(client);
cleanup_counter();
}
void loop() {
read_switch_and_button();
int interval = (millis() - counter_begin_time) / 1000;
if (
((interval >= DATAMININTERVAL) || (interval < 0))
&& WiFi.enableAP(true)
) {
ThingSpeak.setField(1, switch1_counter);
ThingSpeak.setField(2, switch2a_counter);
ThingSpeak.setField(3, switch2b_counter);
ThingSpeak.setField(4, btngrp3_counter);
ThingSpeak.setField(5, btngrp4_counter);
ThingSpeak.setField(6, btngrp5_counter);
ThingSpeak.setField(7, interval);
if (ThingSpeak.writeFields(CHANNELID, WRITEAPIKEY) == OK_SUCCESS) {
Serial.println("Write success.");
// cleanup_counter();
// WiFi.enableAP(false);
} else {
Serial.println("Write failed.");
}
}
}
void cleanup_counter() {
counter_begin_time = millis();
switch1_counter = 0;
switch2a_counter = 0;
switch2b_counter = 0;
btngrp3_counter = 0;
btngrp4_counter = 0;
btngrp5_counter = 0;
}
void read_switch_and_button() {
int tmp = digitalRead(D7);
if (tmp != switch1_status) {
switch1_counter++;
switch1_status = tmp;
}
tmp = digitalRead(D6);
if (tmp != switch2a_status) {
switch2a_counter++;
switch2a_status = tmp;
}
tmp = digitalRead(D5);
if (tmp != switch2b_status) {
switch2b_counter++;
switch2b_status = tmp;
}
tmp = digitalRead(D3);
if (tmp != btngrp3_status) {
btngrp3_counter++;
btngrp3_status = tmp;
}
tmp = digitalRead(D2);
if (tmp != btngrp4_status) {
btngrp4_counter++;
btngrp4_status = tmp;
}
tmp = digitalRead(D1);
if (tmp != btngrp5_status) {
btngrp5_counter++;
btngrp5_status = tmp;
}
}
В этом скетче нас интересуют только следующие поля:
#define APSSID “Имя wi-fi” // Имя вашей wi-fi сети
#define APPASS “Пароль” // Пароль от wi-fi
#define CHANNELID 0 // Id канала в сервисе thingspeak
#define WRITEAPIKEY “YOURAPIKEY” // Writeapikey в сервисе thingspeak
а теперь в кранце где посмотреть id канала в thingspeak.
Для этого заходим на сайт https://thingspeak.com/
Далее создаем свой канал. и когда вы создадите канал и зайдете в него , то можно будет увидеть id канала примерно вот так:

А Writeapikey можно посмотреть в вкладке API keys:

Ну а сами компоненты под кнопки создавать вот так и вот здесь:

На этом собственно все. fidget cube готов. Подробнее в красках можно посмотреть в видео: