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

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.

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

Popular posts from this blog

Connecting Raspberry Pi 2 to P10(1R)-V706 LED Dot Matrix - Raspberry Pi Forums

TypeError: <unknown> is not a numpy array - Raspberry Pi Forums

datso and removing imagetitle - Joomla! Forum - community, help and support