Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Integracion con alexa
#1
bueno, he integrado alexa a domuino gracias a espalexa o fauxmoesp.

generan dispositivos virtuales de alexa, y con ellos activas las salidas de un esp8266 o esp32.

con las salidas, se las metes a un domuino con entradas y programas lo que quieras.

hasta aqui lo tengo todo implementado con varias luces en ON/OFF.

el problema, que quiero poner las persianas para que vayan a un %, cosa que el espalexa admite tanto con analogico como por pwm y con un led consigo dimmarlo, pero no consigo meter la salida al domuino, ya que si creo una salida del A0 del espalexa que dimma correctamente un led, si lo meto a una entrada analogica de un domuino me da valores que van cambiando continuamente.

como puedo introducirle entradas pwm o analogicas al domuino?

copio el codigo que he usado para la prueba (solo he utilizado light 1 aunque salen 3)


Código:
/*
* This is a basic example on how to use Espalexa and its device declaration methods.
*/
#ifdef ARDUINO_ARCH_ESP32
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif
#include <Espalexa.h>

#define D0 16
#define D1 5
#define D2 4
#define D3 0
#define D4 2
#define D5 14
#define D6 12
#define D7 13
#define D8 15
#define D9 3
#define D10 1
#define A0 A0

// prototypes
boolean connectWifi();

//callback functions
void firstLightChanged(uint8_t brightness);
void secondLightChanged(uint8_t brightness);
void thirdLightChanged(uint8_t brightness);

// Change this!!
const char* ssid = "----";
const char* password = "---";

boolean wifiConnected = false;

Espalexa espalexa;

EspalexaDevice* device3; //this is optional

void setup()
{
 Serial.begin(115200);
 // Initialise wifi connection
 wifiConnected = connectWifi();
 
 if(wifiConnected){
   
   // Define your devices here.
   espalexa.addDevice("Light 1", firstLightChanged); //simplest definition, default state off
   espalexa.addDevice("Light 2", secondLightChanged, 255); //third parameter is beginning state (here fully on)
   
   device3 = new EspalexaDevice("Light 3", thirdLightChanged); //you can also create the Device objects yourself like here
   espalexa.addDevice(device3); //and then add them
   device3->setValue(128); //this allows you to e.g. update their state value at any time!

   espalexa.begin();
   
 } else
 {
   while (1) {
     Serial.println("Cannot connect to WiFi. Please check data and reset the ESP.");
     delay(2500);
   }
 }
}

void loop()
{
  espalexa.loop();
  delay(1);
}

//our callback functions
void firstLightChanged(uint8_t brightness) {
   Serial.print("Device 1 changed to ");
   
   //do what you need to do here

   //EXAMPLE
   if (brightness) {
     Serial.print("ON, brightness ");
     Serial.println(brightness);
     analogWrite(A0, brightness);
   }
   else  {
     Serial.println("OFF");
   }
}

void secondLightChanged(uint8_t brightness) {
 //do what you need to do here
}

void thirdLightChanged(uint8_t brightness) {
 //do what you need to do here
}

// connect to wifi – returns true if successful or false if not
boolean connectWifi(){
 boolean state = true;
 int i = 0;
 
 WiFi.mode(WIFI_STA);
 WiFi.begin(ssid, password);
 Serial.println("");
 Serial.println("Connecting to WiFi");

 // Wait for connection
 Serial.print("Connecting...");
 while (WiFi.status() != WL_CONNECTED) {
   delay(500);
   Serial.print(".");
   if (i > 20){
     state = false; break;
   }
   i++;
 }
 Serial.println("");
 if (state){
   Serial.print("Connected to ");
   Serial.println(ssid);
   Serial.print("IP address: ");
   Serial.println(WiFi.localIP());
 }
 else {
   Serial.println("Connection failed.");
 }
 return state;
}
De mayor quiero ser un Dios como Almagar!
Responder
#2
Claro, estas metiendo una señal pwm a una entrada analógica. El pwm es una señal cuadrada de 5v y 0v a varios kHz creo, en la que se varía el porcentaje de alto/bajo. Si quieres luz a tope, el ciclo es 5v 100%, 0V 0%, si quieres iluminación al 70%, el ciclo es 5V 70% 0V 30%.

En realidad no es una variación de voltaje progresiva. Se puede hacer un conversor de pwm a voltaje progresivo mediante resistencia(s) y condensador, pero no lo he probado nunca. Creo que en el foro se ha explicado en algún momento.

Pero le veo un gran riesgo: Al controlar las persianas por la señal analógica, una variación de tensión, te puede hacer que las persianas se muevan. Si es una cosa que no sucede mucho, no pasa nada, pero si se trata de oscilaciones aleatorias, puedes tener las persianas micromoviéndose constantemente, y acabarías loco y con los motores quemados.
Responder
#3
(05-06-2020, 10:11 PM)MIBI escribió: Claro, estas metiendo una señal pwm a una entrada analógica. El pwm es una señal cuadrada de 5v y 0v a varios kHz creo, en la que se varía el porcentaje de alto/bajo. Si quieres luz a tope, el ciclo es 5v 100%, 0V 0%, si quieres iluminación al 70%, el ciclo es 5V 70% 0V 30%.

En realidad no es una variación de voltaje progresiva. Se puede hacer un conversor de pwm a voltaje progresivo mediante resistencia(s) y condensador, pero no lo he probado nunca. Creo que en el foro se ha explicado en algún momento.

Pero le veo un gran riesgo: Al controlar las persianas por la señal analógica, una variación de tensión, te puede hacer que las persianas se muevan. Si es una cosa que no sucede mucho, no pasa nada, pero si se trata de oscilaciones aleatorias, puedes tener las persianas micromoviéndose constantemente, y acabarías loco y con los motores quemados.

En principio sí es por el A0 y con analogwrite, debería ser salida analógica no?

Por pwm aunque en la app de domuino muestra los pines, entiendo que no es posible crear una entrada pwm verdad?
De mayor quiero ser un Dios como Almagar!
Responder
#4
Las salidas analógicas de arduino no tienen DAC, por tanto no da un rango de voltajes, es PWM, y solo son salidas (AnalogWrite).

La lectura analógica (AnalogRead) si tiene ADC, de 10 y 12bits. Convierte voltajes en un numero de 0 a 1023 o 4095, siendo 0 0V y max +V.

DOMUNIO no es capaz de leer un valor PWM "a pelo", de ahí el truco de resistencia y condensador. Una señal PWM se puede filtrar para generar un voltaje variable. Pero yo no lo he hecho nunca y no se que valores hay que poner. En el foro se ha hablado de ello.

Sin embargo, si estás haciendo un proyecto para leer con un arduino pulsos pwm, si se puede hacer: https://www.benripley.com/diy/arduino/th...h-arduino/
Responder
#5
Nada, no hay manera.

Me ha llegado el esp32 y he compilado con dacWrite en el gpio 25 y lo mismo.

Un led si que varía el brillo, pero si lo meto al domuino da valores aleatorios.

Pensaba que con el dac debería funcionar porque según tengo entendido es un voltaje que cambia y no tiene frecuencias, así que no sé si hago algo mal o simplemente el domuino no lo admite
De mayor quiero ser un Dios como Almagar!
Responder
#6
(05-10-2020, 08:55 AM)ramos_45 escribió: Nada, no hay manera.

Me ha llegado el esp32 y he compilado con dacWrite en el gpio 25 y lo mismo.

Un led si que varía el brillo, pero si lo meto al domuino da valores aleatorios.

Pensaba que con el dac debería funcionar porque según tengo entendido es un voltaje que cambia y no tiene frecuencias, así que no sé si hago algo mal o simplemente el domuino no lo admite

Si es un DAC (físico, un elemento conectado por I2C habitualmente) si saca una señal analógica, entre 0 y +V en tantos valores posibles como 2^bit del DAC. Si es de 12bits, 4096 niveles, 0,001V por nivel si es alimentado a 5V -> bastante preciso.

Pero me da que tu no tienes un DAC... Y as señales analógicas que genera arduino son PWM. Necesitas esto, aunque como verás no es perfecto, tiene cierto retraso y algo de rizado en la señal de salida, en función del PWM que uses (Mirate la documentación del arduino para saber la frecuencia del PWM en cada pin, que puede variar):

https://www.luisllamas.es/salida-analogi...paso-bajo/
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)