Вентилятор для zwift с алисой +7


Всем привет. Хочу заранее извинится за корявось решений, кода и изготовления. Во-первых, у меня очень кривые руки, во-вторых, стараюсь сделать с минимальными усилиями и из того, что есть под рукой, — главное чтоб работало стабильно и выполняло нужные функции.

Цель: тренируюсь регулярно на велосипеде, а зимой тренировки проходят дома на велостанке (кстати, он тоже у меня самодельный и это другая история) для обдува практически все, кто так тренируется, используют вентилятор.

У меня вот такой, простой напольный с тремя кнопками скорости.



Нашел его схему:


.
Так как опыта работы с ассинхроными двигателями у меня нет и что будет при одновременном включении двух разных обмоток одновременно я решил не рисковать и не допускать такого поэтому реле подключил следующим образом:



Одно реле включает вентилятор второе переключает скорости.

Получается использую две скорости первую и третью и остается возможность использования вентилятора в ручном режиме на второй скорости.

Блок реле использовал такой:



Контроллер использовал ESP8266:



Прошивал в Arduino IDE.

Код простейший:

#define BLYNK_PRINT Serial

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

#define OUTPUT1  5
#define OUTPUT2  0


char auth[] = "Здесь ваш код авторизации который придет на почту после регистрации на Blynk";

char ssid[] = "имя вашей сети вай фай";
char pass[] = "пароль вашей сети вай фай";

BLYNK_WRITE(V1)
{
  int pinValue = param.asInt(); // assigning incoming value from pin V1 to a variable
digitalWrite(OUTPUT1, pinValue);
  // process received value
}
BLYNK_WRITE(V2)
{
  int pinValue = param.asInt();
  digitalWrite(OUTPUT2, pinValue);
}

void setup()
{

pinMode(OUTPUT1, OUTPUT);
pinMode(OUTPUT2, OUTPUT);
digitalWrite(OUTPUT1, HIGH );
digitalWrite(OUTPUT2, HIGH );

  Blynk.begin(auth, ssid, pass);
  // You can also specify server:

}

void loop()
{
  Blynk.run();
}

Главное получить свой код char auth[] = «Здесь ваш код авторизации который придет на почту после регистрации на Blynk»;
для управления можно использовать ссылки
blynk-cloud.com’вашкодавторизации’/update/V1?value=1 для отключения первого реле
blynk-cloud.com’вашкодавторизации’/update/V1?value=0 для включения первого реле
аналогично для второго
blynk-cloud.com’вашкодавторизации’/update/V2?value=1 blynk-cloud.com’вашкодавторизации’/update/V2?value=0

Первоначально использовал данное устройство и еще несколько дома для простого управления через интернет различными приборами. Так же эти ссылки можжно использовать с Алисой через навык “Домовенок кузя” работает корректно включает и отключает различные устройства.

Получается если остановится на этом уровне можно сделать умную розетку с алисой по стоимости деталей 250 рублей и в ней будет 2 канала и еще на МК будет куча свободных выводов.

Продолжаем дальше. Вентилятор работает включается выключается и т.д. но хотелось еще большей автоматизации. Изначально думал в направлении получения данных напрямую в микроконтроллер с датчика мощности. Даже начал изучать протокол ANT+ но сложности возникли с модулем ANT+ они вроде есть в продаже но какие то дорогие, пока до покупки не дошли руки и тут я случайно наткнулся на приложение на питоне zwift-client, которое умеет получать данные из моего аккаунта. Для установки $ pip install zwift-client Немного почитал про питон и научился считывать свои данные, написал небольшой скрипт:

import time
import requests
from zwift import Client
username = 'ваш логин звифта'
password = 'ваш пароль'
player_id = ваш ид в звите

client = Client(username, password)
world = client.get_world(1)
world.player_status(player_id)
i=1
change1=1
change2=1
powVKL=185

venrabota0='https://blynk-cloud.com/вашидентификаторблинка/update/V1?value=1'
venspeed0='https://blynk-cloud.com/вашидентификаторблинка/update/V1?value=0'
venrabota1='https://blynk-cloud.com/вашидентификаторблинка/update/V2?value=0'
venspeed1='https://blynk-cloud.com/вашидентификаторблинка/update/V2?value=1'
requests.get(venrabota0, verify=False)
requests.get(venspeed0, verify=False)
print('вентилятор выключен')   
while i<10:
    poweruser=world.player_status(player_id).power
    cadenceuser=world.player_status(player_id).cadence
    heartrateuser=world.player_status(player_id).heartrate
    speeduser=world.player_status(player_id).speed//1000000
    print('мощность: '+str(poweruser))
    print('каденс: '+str(cadenceuser))
    print('пульс: '+str(heartrateuser))
    print('скорость: '+str(speeduser))
    
    if change1==1 and speeduser>1: 
        requests.get(venrabota1, verify=False)
        change1=0
    if change1==0 and speeduser<1: 
        requests.get(venrabota0, verify=False)
        change1=1   
        
    if change2==1 and poweruser>powVKL: 
        requests.get(venspeed1, verify=False)
        change2=0
    if change2==0 and poweruser<=powVKL: 
        requests.get(venspeed0, verify=False)
        change2=1   
            
    time.sleep(1) # Delay for 1 minute (60 seconds)

В нем считываются мои данные и при начале движения включается вентилятор а при мощности больше 185 ВТ включается повышенная скорость.

В принципе вроде все. На самом деле решение незаконченное есть еще куча идей для его дальнейшего развития и для игры (изменения скорости вращения вентилятора при попадании в драфт) и мысль выводить информацию о своих параметрах мощность каденс скорость на вращающихся лопастях, управлением этим и другими устройствами напрямую с часов и т.д. никогда конца не будет.




К сожалению, не доступен сервер mySQL