Voice Recognition Light Dimmer; can't figure out two simultaneous loops
hello arduino community. first off, in advance any can provide me following code. extremely appreciated. coding difficult me.
current state: have combined arduino uno r3 easyvr voice recognition module: http://www.veear.eu/products/easyvr-arduino-shield/ , an inmojo dimmer module: http://www.inmojo.com/store/inmojo-market/item/digital-ac-dimmer-module-lite-v.2/.
i turning on , off lamp using voice trigger command followed light on/off voice commands. essentially, recognized voice trigger followed recognized voice command switches 'lightpin' (output 3) high low. recognizeword() , getword() functions continuously looping listen further commands.
however, cannot figure out how integrate dimmer code (which runs loop) run simultaneously voice recognition loop. dimming requires own loop because function continuously writing 'lightpin' high , low depending on speed.
i have researched 'blink without delay' example, timer functions, millis (), , thread libraries, can't work, nor know how integrate functions code.
my goal able trigger command followed voice command dims lamp , continues listen more commands (light on, light off, brighter, dimmer, dim 25%, dim 50%, dim 75%).
grammar_4 = voice trigger, grammar_5 = voice commands
i have pasted both code sets below. if can review , provide help, awesome. unfortunately, not coder. have respect are. if more information required, please let me know. again!
voice recognition on/off commands
dimmer code
current state: have combined arduino uno r3 easyvr voice recognition module: http://www.veear.eu/products/easyvr-arduino-shield/ , an inmojo dimmer module: http://www.inmojo.com/store/inmojo-market/item/digital-ac-dimmer-module-lite-v.2/.
i turning on , off lamp using voice trigger command followed light on/off voice commands. essentially, recognized voice trigger followed recognized voice command switches 'lightpin' (output 3) high low. recognizeword() , getword() functions continuously looping listen further commands.
however, cannot figure out how integrate dimmer code (which runs loop) run simultaneously voice recognition loop. dimming requires own loop because function continuously writing 'lightpin' high , low depending on speed.
i have researched 'blink without delay' example, timer functions, millis (), , thread libraries, can't work, nor know how integrate functions code.
my goal able trigger command followed voice command dims lamp , continues listen more commands (light on, light off, brighter, dimmer, dim 25%, dim 50%, dim 75%).
grammar_4 = voice trigger, grammar_5 = voice commands
i have pasted both code sets below. if can review , provide help, awesome. unfortunately, not coder. have respect are. if more information required, please let me know. again!
voice recognition on/off commands
code: [select]
#if defined(arduino) && arduino >= 100
#include "arduino.h"
#include "platform.h"
#include "softwareserial.h"
#ifndef cdc_enabled // shield jumper on sw
softwareserial port(12,13);
#else // shield jumper on hw (for leonardo)
#define port serial1
#endif
#else // arduino 0022 - use modified newsoftserial
#include "wprogram.h"
#include "newsoftserial.h"
newsoftserial port(12,13);
#endif
#include "easyvr.h"
easyvr easyvr(port);
enum wordset
{
grammar_4 = 4,
grammar_5 = 5,
};
enum grammar4
{
g4_voicelight = 0,
};
enum grammar5
{
g5_light_off = 0,
g5_light_on = 1,
g5_dim_50 = 2,
};
easyvrbridge bridge;
int8_t wordset, idx;
bool setknob(int8_t knob);
bool setlevel(int8_t level);
int lightpin = 3;
long crosstime = 0;
long currentcycle = 0;
int dimming = 0;
void setup()
{
#ifndef cdc_enabled
if (bridge.check()) // bridge mode?
{
cli();
bridge.loop(0, 1, 12, 13);
}
// run normally
serial.begin(9600);
//serial.println("bridge not started!");
#else
if (bridge.check()) // bridge mode?
{
port.begin(9600);
bridge.loop(port);
}
//serial.println("bridge connection aborted!");
#endif
port.begin(9600);
while (!easyvr.detect())
{
//serial.println("easyvr not detected!");
//delay(1000);
}
easyvr.setpinoutput(easyvr::io1, low);
easyvr.settimeout(5);
easyvr.setlanguage(0);
easyvr.setknob(4);
easyvr.setlevel(5);
wordset = 4; //<-- start wordset (customize)
pinmode(2,input);
pinmode(lightpin, output);
digitalwrite(lightpin, low); // set led off
}
void loop()
{
easyvr.setpinoutput(easyvr::io1, high); // led on (listening)
serial.print("say command in wordset ");
serial.println(wordset);
easyvr.recognizeword(wordset);
do
{
// can processing while waiting spoken command
}
while (!easyvr.hasfinished());
easyvr.setpinoutput(easyvr::io1, low); // led off
idx = easyvr.getword();
if (idx >= 0)
{
easyvr.playsound(0, easyvr::vol_full);
action(); // perform action
}
else // errors or timeout
{
if (easyvr.istimeout())
serial.println("timed out, try again...");
int16_t err = easyvr.geterror();
if (err >= 0)
{
serial.print("error ");
serial.println(err, hex);
wordset = 4;
}
}
}
void action()
{
switch (wordset)
{
case grammar_4:
switch (idx)
{
case g4_voicelight:
wordset = grammar_5; // <-- jump wordset x composite commands
break;
}
break;
case grammar_5:
switch (idx)
{
case g5_light_off:
digitalwrite(lightpin, low);
wordset = grammar_4; //<-- jump wordset x composite commands
break;
case g5_light_on:
digitalwrite(lightpin, high);
wordset = grammar_4; // <-- jump wordset x composite commands
break;
case g5_dim_50:
// **not sure here**
wordset = grammar_4; // <-- jump wordset x composite commands
break;
}
break;
}
}
dimmer code
code: [select]
int lightpin = 3;
long crosstime = 0;
long currentcycle = 0;
int dimming = 0;
void setup()
{
pinmode(lightpin, output);
pinmode(2,input);
digitalwrite(lightpin,0);
}
void loop()
{
if(digitalread(2))
{
zerocross();
{
dimming = 6150;
}
}
}
void zerocross(){
crosstime = micros();
while((micros() - crosstime) < 8200){
currentcycle = micros() - crosstime;
if (currentcycle > dimming) digitalwrite(lightpin,1);
digitalwrite(lightpin,0);
}
}
i build own dimmer, works same way , had more things arduino dimming.
i had comunicate anothers via uart, read sensors, activate relays, read keyboards etc..
so have 2 options:
1) use 2 arduinos. 1 general functions, case run easyvr code, , dimming lights , communicate between. did, because dimmers timming essencial.
2) see, code not big , complicated. see have put dimmer code inside "do while" part.
i dont know if correct, didnt gone deep in code. suggest attach interrupt pin 2 (zerocrossdetection?) on dimmer.
i had comunicate anothers via uart, read sensors, activate relays, read keyboards etc..
so have 2 options:
1) use 2 arduinos. 1 general functions, case run easyvr code, , dimming lights , communicate between. did, because dimmers timming essencial.
2) see, code not big , complicated. see have put dimmer code inside "do while" part.
code: [select]
#if defined(arduino) && arduino >= 100
#include "arduino.h"
#include "platform.h"
#include "softwareserial.h"
#ifndef cdc_enabled // shield jumper on sw
softwareserial port(12,13);
#else // shield jumper on hw (for leonardo)
#define port serial1
#endif
#else // arduino 0022 - use modified newsoftserial
#include "wprogram.h"
#include "newsoftserial.h"
newsoftserial port(12,13);
#endif
#include "easyvr.h"
easyvr easyvr(port);
enum wordset
{
grammar_4 = 4,
grammar_5 = 5,
};
enum grammar4
{
g4_voicelight = 0,
};
enum grammar5
{
g5_light_off = 0,
g5_light_on = 1,
g5_dim_50 = 2,
};
easyvrbridge bridge;
int8_t wordset, idx;
bool setknob(int8_t knob);
bool setlevel(int8_t level);
int lightpin = 3;
long crosstime = 0;
long currentcycle = 0;
int dimming = 0;
void setup()
{
#ifndef cdc_enabled
if (bridge.check()) // bridge mode?
{
cli();
bridge.loop(0, 1, 12, 13);
}
// run normally
serial.begin(9600);
//serial.println("bridge not started!");
#else
if (bridge.check()) // bridge mode?
{
port.begin(9600);
bridge.loop(port);
}
//serial.println("bridge connection aborted!");
#endif
port.begin(9600);
while (!easyvr.detect())
{
//serial.println("easyvr not detected!");
//delay(1000);
}
easyvr.setpinoutput(easyvr::io1, low);
easyvr.settimeout(5);
easyvr.setlanguage(0);
easyvr.setknob(4);
easyvr.setlevel(5);
wordset = 4; //<-- start wordset (customize)
pinmode(2,input);
pinmode(lightpin, output);
digitalwrite(lightpin, low); // set led off
}
void loop()
{
easyvr.setpinoutput(easyvr::io1, high); // led on (listening)
serial.print("say command in wordset ");
serial.println(wordset);
easyvr.recognizeword(wordset);
do
{
//i put part
if(digitalread(2))
{
zerocross();
{
dimming = 6150;
}
}
}
while (!easyvr.hasfinished());
easyvr.setpinoutput(easyvr::io1, low); // led off
idx = easyvr.getword();
if (idx >= 0)
{
easyvr.playsound(0, easyvr::vol_full);
action(); // perform action
}
else // errors or timeout
{
if (easyvr.istimeout())
serial.println("timed out, try again...");
int16_t err = easyvr.geterror();
if (err >= 0)
{
serial.print("error ");
serial.println(err, hex);
wordset = 4;
}
}
}
void action()
{
switch (wordset)
{
case grammar_4:
switch (idx)
{
case g4_voicelight:
wordset = grammar_5; // <-- jump wordset x composite commands
break;
}
break;
case grammar_5:
switch (idx)
{
case g5_light_off:
digitalwrite(lightpin, low);
wordset = grammar_4; //<-- jump wordset x composite commands
break;
case g5_light_on:
digitalwrite(lightpin, high);
wordset = grammar_4; // <-- jump wordset x composite commands
break;
case g5_dim_50:
// **not sure here**
wordset = grammar_4; // <-- jump wordset x composite commands
break;
}
break;
}
}
i dont know if correct, didnt gone deep in code. suggest attach interrupt pin 2 (zerocrossdetection?) on dimmer.
Arduino Forum > Using Arduino > LEDs and Multiplexing > Voice Recognition Light Dimmer; can't figure out two simultaneous loops
arduino
Comments
Post a Comment