Hello everyone,
I’m developing a project where I want to control my shutters with the Blynk app. At home, every shutter motor has a receiver on 433 MHz. I have a remote (sender) with 20 channels, only 8 of them are used right now.
I made a receiver with the XLC-RF-5V module for Arduino to catch the code my shutter remote sends to the shutters. I found out the codes the old fashion way by reading the analog output of the receiver and reading the high and low signal lengths. Then, I wrote a code to send that same signal again with my sender module (FS1000A). When I use my function transmitCode (see code below) in setup() with the code for one channel, it works. But now, I integrated this code into the Blynk code, but it doesn’t seem to work.
The idea with the blynk app is that I have a selection widget with 9 options and below, I have 3 buttons: one for making a shutter go up, one to make it go down and one to make it stop. According to which option is selected from the widget, those 3 buttons have a different function (they send the code for up, down or stop from the selected shutter).
Can anyone explain why this code works if I put “transmitCode(kanaal_1_op);” in the setup() but doesn’t work when called in the Blynk.write() function?
Thanks in advance!
Alexander
My app:
My code:
/*
Transmit sketch - RF Calibration
Written by ScottC 17 July 2014
Arduino IDE version 1.0.5
Website: http://arduinobasics.blogspot.com.au/2014/07/433-mhz-rf-module-with-arduino-tutorial.html
Transmitter: FS1000A/XY-FST
Description: A simple sketch used to calibrate RF transmission.
------------------------------------------------------------- */
//433 MHz:
#define rfTransmitPin 51 //RF Transmitter pin = digital pin 22
#define ledPin 13 //Onboard LED = digital pin 13
//Blynk:
#define BLYNK_PRINT Serial
#include <SPI.h>
#include <Ethernet2.h>
#include <BlynkSimpleEthernet2.h>
char auth[] = "6k530qBs2SLxqQge4cb4lXu57xuyzwhd";
//basis van code (vast deel): {15,5,5,2,2,2,5,2,2,2,5,2,2,2,2,2,2,2,2,5,5,2,2,5,2,2,2,2,2}
const int codeSize = 41; //lengte van de code (aantal posities in de arrays hieronder)
int codeToTransmit[codeSize]; //The array used to hold the RF code
int kanaal_0_op[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 8}; //Code voor kanaal 1 op
int kanaal_0_neer[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 8}; //Code voor kanaal 1 neer
int kanaal_0_stop[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 5, 2, 5, 2, 8}; //Code voor kanaal 1 stop
int kanaal_1_op[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 8}; //Code voor kanaal 1 op
int kanaal_1_neer[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 5, 5, 2, 2, 5, 8}; //Code voor kanaal 1 neer
int kanaal_1_stop[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 5, 2, 5, 2, 5, 2, 8}; //Code voor kanaal 1 stop
int kanaal_2_op[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 5, 2, 2, 2, 8};
int kanaal_2_neer[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 5, 5, 2, 2, 5, 8};
int kanaal_2_stop[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 5, 2, 5, 2, 5, 2, 8};
int kanaal_3_op[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 2, 5, 2, 2, 2, 8};
int kanaal_3_neer[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 5, 2, 2, 5, 8};
int kanaal_3_stop[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 5, 2, 5, 2, 5, 2, 8};
int kanaal_4_op[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 5, 2, 2, 2, 8};
int kanaal_4_neer[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 5, 5, 2, 2, 5, 8};
int kanaal_4_stop[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 5, 2, 5, 2, 5, 2, 8};
int kanaal_5_op[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 5, 2, 5, 2, 2, 2, 5, 2, 2, 2, 8};
int kanaal_5_neer[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 5, 2, 5, 2, 2, 5, 5, 2, 2, 5, 8};
int kanaal_5_stop[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 5, 2, 5, 2, 5, 2, 5, 2, 5, 2, 8};
int kanaal_6_op[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 2, 2, 5, 2, 2, 2, 8};
int kanaal_6_neer[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 2, 5, 5, 2, 2, 5, 8};
int kanaal_6_stop[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 5, 2, 5, 2, 8};
int kanaal_7_op[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 5, 5, 5, 2, 2, 2, 5, 2, 2, 2, 8};
int kanaal_7_neer[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 5, 5, 5, 2, 2, 5, 5, 2, 2, 5, 8};
int kanaal_7_stop[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 5, 5, 5, 2, 5, 2, 5, 2, 5, 2, 8};
int kanaal_8_op[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 8};
int kanaal_8_neer[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 8};
int kanaal_8_stop[] = {15, 5, 5, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 5, 2, 5, 2, 5, 2, 8};
int kanaal_test1_op[] = {15, 5, 15, 15, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 8}; //Code voor kanaal 1 op
int kanaal_test1_neer[] = {15, 5, 15, 15, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 5, 5, 2, 2, 5, 8}; //Code voor kanaal 1 neer
int kanaal_test1_stop[] = {15, 5, 15, 15, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 5, 2, 5, 2, 5, 2, 8}; //Code voor kanaal 1 stop
int kanaal_test2_op[] = {15, 5, 15, 15, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 5, 2, 2, 2, 6};
int kanaal_test2_neer[] = {15, 5, 15, 15, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 5, 5, 2, 2, 5, 6};
int kanaal_test2_stop[] = {15, 5, 15, 15, 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 5, 2, 5, 2, 5, 2, 6};
int codeToggler = 0; //Used to switch between turning the light ON and OFF
int timeDelay = 115; // The variable used to calibrate the RF signal lengths. Delay = tussen 95-125 voor rolluiksturing
int geselecteerdOp[codeSize];
int geselecteerdNeer[codeSize];
int geselecteerdStop[codeSize];
void setup() {
Serial.begin(9600); // Turn the Serial Protocol ON
pinMode(rfTransmitPin, OUTPUT); //Transmit pin is an output
pinMode(ledPin, OUTPUT);
delay(2000);
Blynk.begin(auth);
Blynk.virtualWrite(V1, 0);
Blynk.virtualWrite(V2, 0);
Blynk.virtualWrite(V3, 0);
}
void loop() {
Blynk.run();
}
/*----------------------------------------------------------------
BLYNK CODE
------------------------------------------------------------------*/
BLYNK_WRITE(V0) {
Blynk.virtualWrite(V1, 0);
Blynk.virtualWrite(V2, 0);
Blynk.virtualWrite(V3, 0);
switch (param.asInt())
{
case 1: // Alles
equalArray(geselecteerdOp, kanaal_1_op);
equalArray(geselecteerdNeer, kanaal_1_neer);
equalArray(geselecteerdStop, kanaal_1_stop);
Serial.println("Alles geselecteerd");
break;
case 2: // Keuken klein
equalArray(geselecteerdOp, kanaal_2_op);
equalArray(geselecteerdNeer, kanaal_2_neer);
equalArray(geselecteerdStop, kanaal_2_stop);
Serial.println("Keuken klein geselecteerd");
break;
case 3: // Keuken groot
equalArray(geselecteerdOp, kanaal_2_op);
equalArray(geselecteerdNeer, kanaal_2_neer);
equalArray(geselecteerdStop, kanaal_2_stop);
Serial.println("Keuken groot geselecteerd");
break;
case 4: // Keuken hoek
equalArray(geselecteerdOp, kanaal_3_op);
equalArray(geselecteerdNeer, kanaal_3_neer);
equalArray(geselecteerdStop, kanaal_3_stop);
Serial.println("Keuken hoek geselecteerd");
break;
case 5: // Living achter
equalArray(geselecteerdOp, kanaal_4_op);
equalArray(geselecteerdNeer, kanaal_4_neer);
equalArray(geselecteerdStop, kanaal_4_stop);
Serial.println("Living achter geselecteerd");
break;
case 6: // Living achter klein
//equalArray(geselecteerdOp,kanaal_5_op);
//equalArray(geselecteerdNeer,kanaal_5_neer);
//equalArray(geselecteerdStop,kanaal_5_stop);
Serial.println("Living achter klein geselecteerd");
break;
case 7: // Living klein
equalArray(geselecteerdOp, kanaal_6_op);
equalArray(geselecteerdNeer, kanaal_6_neer);
equalArray(geselecteerdStop, kanaal_6_stop);
Serial.println("Living klein geselecteerd");
break;
case 8: // Living voor klein
equalArray(geselecteerdOp, kanaal_7_op);
equalArray(geselecteerdNeer, kanaal_7_neer);
equalArray(geselecteerdStop, kanaal_7_stop);
Serial.println("Living voor klein geselecteerd");
break;
case 9: // Living voor
equalArray(geselecteerdOp, kanaal_8_op);
equalArray(geselecteerdNeer, kanaal_8_neer);
equalArray(geselecteerdStop, kanaal_8_stop);
Serial.println("Living voor geselecteerd");
break;
default:
Serial.println("Niks geselecteerd");
}
}
void equalArray(int teWijzigenArray[], int referentieArray[])
{
for (int i = 0; i < 41; i++)
{
teWijzigenArray[i] = referentieArray[i];
}
}
void printArray(int tePrintenArray[])
{
Serial.print("Ingestelde Array: ");
for (int i = 0; i < 41; i++)
{
Serial.print(tePrintenArray[i]);
Serial.print(",");
}
Serial.println();
}
BLYNK_WRITE(V1)
{
int value = param.asInt(); // Get value as integer
if (value == 1)
{
transmitCode(geselecteerdOp);
Serial.println("op");
}
}
BLYNK_WRITE(V2)
{
int value = param.asInt(); // Get value as integer
if (value == 1)
{
transmitCode(geselecteerdStop);
Serial.println("stop");
}
}
BLYNK_WRITE(V3)
{
int value = param.asInt(); // Get value as integer
if (value == 1)
{
transmitCode(geselecteerdNeer);
Serial.println("neer");
}
}
/*-----------------------------------------------------------------
433 MHz CODE
-------------------------------------------------------------------*/
/*-----------------------------------------------------------------
transmitCode(): Used to transmit the signal to the RF receiver on
the fan/light. There are 6 different HIGH-LOW signal combinations.
SH = short high or LH = long high
PLUS
SL = short low or LL = long low or VLL = very long low
-------------------------------------------------------------------*/
void transmitCode(int code[]) {
// The LED will be turned on to create a visual signal transmission indicator.
digitalWrite(ledPin, HIGH);
printArray(geselecteerdOp);
printArray(geselecteerdNeer);
printArray(geselecteerdStop);
//initialise the variables
int highLength = 0;
int lowLength = 0;
//The signal is transmitted 6 times in succession - this may vary with your remote.
// 2-6-14-46
for (int j = 0; j < 6; j++) {
for (int i = 0; i < codeSize; i++) {
switch (code[i]) {
case 1: // SL + SH
highLength = 2;
lowLength = 2;
break;
case 2: // SL + MH
highLength = 6;
lowLength = 2;
break;
case 3: // SL + LH
highLength = 14;
lowLength = 2;
break;
case 4: // SL + VLH
highLength = 38;
lowLength = 2;
break;
case 5: // ML + SH
highLength = 2;
lowLength = 6;
break;
case 6: // ML + MH
highLength = 6;
lowLength = 6;
break;
case 7: // ML + LH
highLength = 14;
lowLength = 6;
break;
case 8: // ML + VLH
highLength = 38;
lowLength = 6;
break;
case 9: // LL + SH
highLength = 2;
lowLength = 14;
break;
case 10: // LL + MH
highLength = 6;
lowLength = 14;
break;
case 11: // LL + LH
highLength = 14;
lowLength = 14;
break;
case 12: // LL + VLH
highLength = 38;
lowLength = 14;
break;
case 13: // VLL + SH
highLength = 2;
lowLength = 46;
break;
case 14: // VLL + MH
highLength = 6;
lowLength = 46;
break;
case 15: // VLL + LH
highLength = 14;
lowLength = 46;
break;
case 16: // VLL + VLH
highLength = 38;
lowLength = 46;
break;
}
/* Transmit a HIGH signal - the duration of transmission will be determined
by the highLength and timeDelay variables */
digitalWrite(rfTransmitPin, HIGH);
delayMicroseconds(lowLength * timeDelay); // was highLength
/* Transmit a LOW signal - the duration of transmission will be determined
by the lowLength and timeDelay variables */
digitalWrite(rfTransmitPin, LOW);
delayMicroseconds(highLength * timeDelay); // was lowLength
}
}
//Turn the LED off after the code has been transmitted.
digitalWrite(ledPin, LOW);
}