Arduino IR receiver and loops - arduino

so i built a small shield for arduino mega. it has 2 red leds, 2 blue leds, 2 green leds, a buzzer, an rgb led and an IR receiver. Im trying to simulate ON and OFF with the rgb led, and when it is on you can perform actions based on the button you press on the emitter. Everything works more or less as expected but i dont know how to exit the loop on each button action. Here s my code:
int receiver = 9;
IRrecv irrecv(receiver);
decode_results results;
void translateIR()
{
switch(results.value)
{
case 0xFFA25D: power(); break;
case 0xFF30CF: button1(); break;
case 0xFF18E7: button2(); break;
case 0xFF7A85: button3(); break;
case 0xFF10EF: button4(); break;
case 0xFF38C7: button5(); break;
case 0xFF5AA5: button6(); break;
case 0xFF42BD: button7(); break;
case 0xFF4AB5: button8(); break;
case 0xFF52AD: button9(); break;
default:;
}
}
void button1()
{
digitalWrite(LEDR1, LOW);
digitalWrite(LEDR2, LOW);
digitalWrite(LEDB1, LOW);
digitalWrite(LEDB2, LOW);
digitalWrite(LEDG1, LOW);
digitalWrite(LEDG2, LOW);
digitalWrite(buzzer,LOW);
do{
digitalWrite(LEDR1, HIGH);
digitalWrite(LEDR2, HIGH);
digitalWrite(LEDB1, LOW);
digitalWrite(LEDB2, LOW);
digitalWrite(LEDG1, LOW);
digitalWrite(LEDG2, LOW);
digitalWrite(buzzer,HIGH);
delay(200);
digitalWrite(LEDR1, LOW);
digitalWrite(LEDR2, LOW);
digitalWrite(LEDB1, HIGH);
digitalWrite(LEDB2, HIGH);
digitalWrite(LEDG1, LOW);
digitalWrite(LEDG2, LOW);
digitalWrite(buzzer,LOW);
delay(200);
} while(1);
}
void button2()
{
digitalWrite(LEDR1, LOW);
digitalWrite(LEDR2, LOW);
digitalWrite(LEDB1, LOW);
digitalWrite(LEDB2, LOW);
digitalWrite(LEDG1, LOW);
digitalWrite(LEDG2, LOW);
digitalWrite(buzzer,LOW);
do{
digitalWrite(LEDR1, HIGH);
digitalWrite(LEDR2, LOW);
digitalWrite(LEDB1, LOW);
digitalWrite(LEDB2, LOW);
digitalWrite(LEDG1, LOW);
digitalWrite(LEDG2, LOW);
digitalWrite(buzzer,HIGH);
delay(50);
digitalWrite(LEDR1, LOW);
digitalWrite(LEDR2, HIGH);
digitalWrite(LEDB1, LOW);
digitalWrite(LEDB2, LOW);
digitalWrite(LEDG1, LOW);
digitalWrite(LEDG2, LOW);
digitalWrite(buzzer,LOW);
delay(50);
digitalWrite(LEDR1, LOW);
digitalWrite(LEDR2, LOW);
digitalWrite(LEDB1, HIGH);
digitalWrite(LEDB2, LOW);
digitalWrite(LEDG1, LOW);
digitalWrite(LEDG2, LOW);
digitalWrite(buzzer,HIGH);
delay(50);
digitalWrite(LEDR1, LOW);
digitalWrite(LEDR2, LOW);
digitalWrite(LEDB1, LOW);
digitalWrite(LEDB2, HIGH);
digitalWrite(LEDG1, LOW);
digitalWrite(LEDG2, LOW);
digitalWrite(buzzer,LOW);
delay(50);
digitalWrite(LEDR1, LOW);
digitalWrite(LEDR2, LOW);
digitalWrite(LEDB1, LOW);
digitalWrite(LEDB2, LOW);
digitalWrite(LEDG1, HIGH);
digitalWrite(LEDG2, LOW);
digitalWrite(buzzer,HIGH);
delay(50);
digitalWrite(LEDR1, LOW);
digitalWrite(LEDR2, LOW);
digitalWrite(LEDB1, LOW);
digitalWrite(LEDB2, LOW);
digitalWrite(LEDG1, LOW);
digitalWrite(LEDG2, HIGH);
digitalWrite(buzzer,LOW);
delay(50);
} while(1);
}
void loop() {
if (irrecv.decode(&results)) // have we received an IR signal?
{
translateIR();
irrecv.resume(); // receive the next value
}
}
With this code cannot exit the loop on button 1 and button 2 no matter wath other button i press after. So I tried adding this on the loop:
do{
digitalWrite(LEDR1, HIGH);
digitalWrite(LEDR2, HIGH);
digitalWrite(LEDB1, LOW);
digitalWrite(LEDB2, LOW);
digitalWrite(LEDG1, LOW);
digitalWrite(LEDG2, LOW);
digitalWrite(buzzer,HIGH);
delay(200);
digitalWrite(LEDR1, LOW);
digitalWrite(LEDR2, LOW);
digitalWrite(LEDB1, HIGH);
digitalWrite(LEDB2, HIGH);
digitalWrite(LEDG1, LOW);
digitalWrite(LEDG2, LOW);
digitalWrite(buzzer,LOW);
delay(200);
if (irrecv.decode(&results)) // have we received an IR signal?
{
translateIR();
irrecv.resume(); // receive the next value
}
} while(1);
But still cannot exit the loop no matter what button i press. Then i tried adding this on the while:
do{
digitalWrite(LEDR1, HIGH);
digitalWrite(LEDR2, HIGH);
digitalWrite(LEDB1, LOW);
digitalWrite(LEDB2, LOW);
digitalWrite(LEDG1, LOW);
digitalWrite(LEDG2, LOW);
digitalWrite(buzzer,HIGH);
delay(200);
digitalWrite(LEDR1, LOW);
digitalWrite(LEDR2, LOW);
digitalWrite(LEDB1, HIGH);
digitalWrite(LEDB2, HIGH);
digitalWrite(LEDG1, LOW);
digitalWrite(LEDG2, LOW);
digitalWrite(buzzer,LOW);
delay(200);
} while(!(irrecv.decode(&results)));
But it doesnt exit the loop either. Any idea?

Related

HC-05 to control car has delays and disconnection

I made some simple code and car using 1 arduino, 1 hc-05, 2 L298N, and 4 batteries. I control them with the app Bluetooth RC controller on android. When I send a command on the app, the car sometimes has some delays, varying 4-8 seconds, sometimes it disconnects completely. Here is the code. I don't think the code has any problem and my friend brought up that the problem might be the distortion from a magnetic field because I use some lead to weld some wires
char t;
int fr1= 2;
int fr2=3;
int fl1=12;
int fl2=13;
int br1=4;
int br2=5;
int bl1 = 7;
int bl2=8;
int Mfr=6;//speed setting
int Mfl=9;
int Mbr=10;
int Mbl=11;
float Speed;
void setup() {
pinMode(fr1,OUTPUT); //fr1
pinMode(fr2,OUTPUT); //fr2
pinMode(fl1,OUTPUT); //fl1
pinMode(fl2,OUTPUT); //fl2
pinMode(br1,OUTPUT); //br1
pinMode(br2,OUTPUT); //br2
pinMode(bl1,OUTPUT); //bl1
pinMode(bl2,OUTPUT); //bl2
Serial.begin(9600);
}
void loop() {
if(Serial.available()){
t = Serial.read();
Serial.println(t);
}
if(t == 'F'){
digitalWrite(fr1, LOW);
digitalWrite(fr2, HIGH);
digitalWrite(fl1, LOW);
digitalWrite(fl2, HIGH);
digitalWrite(br1, LOW);
digitalWrite(br2, HIGH);
digitalWrite(bl1, LOW);
digitalWrite(bl2, HIGH);
}
else if(t == 'B'){
digitalWrite(fr1, HIGH);
digitalWrite(fr2, LOW);
digitalWrite(fl1, HIGH);
digitalWrite(fl2, LOW);
digitalWrite(br1, HIGH);
digitalWrite(br2, LOW);
digitalWrite(bl1, HIGH);
digitalWrite(bl2, LOW);
}
else if(t == 'L'){
digitalWrite(fr1, LOW);
digitalWrite(fr2, HIGH);
digitalWrite(fl1, HIGH);
digitalWrite(fl2, LOW);
digitalWrite(br1, HIGH);
digitalWrite(br2, LOW);
digitalWrite(bl1, LOW);
digitalWrite(bl2, HIGH);
}
else if(t == 'R'){
digitalWrite(fr1, HIGH);
digitalWrite(fr2, LOW);
digitalWrite(fl1, LOW);
digitalWrite(fl2, HIGH);
digitalWrite(br1, LOW);
digitalWrite(br2, HIGH);
digitalWrite(bl1, HIGH);
digitalWrite(bl2, LOW);
}
else if(t == 'S'){ //STOP (all motors stop)
digitalWrite(fr1, LOW);
digitalWrite(fr2, LOW);
digitalWrite(fl1, LOW);
digitalWrite(fl2, LOW);
digitalWrite(br1, LOW);
digitalWrite(br2, LOW);
digitalWrite(bl1, LOW);
digitalWrite(bl2, LOW);
}
}
Is it possible its gotten flooded by bytes, serial.read had to read? I imagine maybe the app is sending a lot of characters to the Arduino, is it possible to check/apply a (short) delay in that app?

Can't get time right with arduino?

I have a small 7 segment led display and I wondered if I could get it to show me the last digit of the minute. Downloaded the Time library for Arduino and I tried several methods, with switch case and if else if, but all give the same result, the LED display shows only 0... Could you pinpoint what I did wrong?
#include <Time.h>
#include <TimeLib.h>
int led1=2;
int led2=3;
int led3=4;
int led4=5;
int led5=6;
int led6=7;
int led7=8;
int led8=9;
void setup() {
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
pinMode(led4,OUTPUT);
pinMode(led5,OUTPUT);
pinMode(led6,OUTPUT);
pinMode(led7,OUTPUT);
pinMode(led8,OUTPUT);
}
void loop(){
time_t t=minute();
int digit1=t%10;
if(digit1==1){
digitalWrite(led5, HIGH);
digitalWrite(led3, HIGH);
}else if(digit1==2)
{
digitalWrite(led6, HIGH);
digitalWrite(led5, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
} else if(digit1==3)
{
digitalWrite(led4, HIGH);
digitalWrite(led6, HIGH);
digitalWrite(led5, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led2, HIGH);
}else if(digit1==4)
{
digitalWrite(led4, HIGH);
digitalWrite(led7, HIGH);
digitalWrite(led5, HIGH);
digitalWrite(led3, HIGH);
}else if(digit1==5)
{
digitalWrite(led6, HIGH);
digitalWrite(led7, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led2, HIGH);
}else if(digit1==6)
{
digitalWrite(led6, HIGH);
digitalWrite(led7, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
}else if(digit1==7)
{
digitalWrite(led5, HIGH);
digitalWrite(led6, HIGH);
digitalWrite(led3, HIGH);
}else if(digit1==8)
{
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led5, HIGH);
digitalWrite(led6, HIGH);
digitalWrite(led7, HIGH);
}else if(digit1==9)
{
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led5, HIGH);
digitalWrite(led6, HIGH);
digitalWrite(led7, HIGH);
}else if(digit1==0)
{
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led5, HIGH);
digitalWrite(led6, HIGH);
digitalWrite(led7, HIGH);
}
}
You never write any of the pins to go low. When the next minute hits, the proper LEDS are probably turning on, but the old ones don't go off, so you don't see any change.
To avoid turning all the LEDS off and on again every cycle, I would store the last known digit and at each loop iteration, see if the digit has changed. If it has, turn off all of the lights and then run the code you posted here.
You haven't added low conditions hence when the pin is going high it is remaining high. Also, I have checked and I think that your wiring is not correct. I'm posting complete code below and connections accordingly.
#include <Time.h>
#include <TimeLib.h>
int a = 2;
int b = 3;
int c = 4;
int d = 5;
int e = 6;
int f = 7;
int g = 8;
int dp = 9;
void setup() {
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
pinMode(led4,OUTPUT);
pinMode(led5,OUTPUT);
pinMode(led6,OUTPUT);
pinMode(led7,OUTPUT);
pinMode(led8,OUTPUT);
}
void loop(){
time_t t=minute();
int digit1=t%10;
if(digit1==0) {
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
digitalWrite(dp, LOW);
}
else if(digit1==1) {
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(dp, LOW);
}
else if(digit1==2) {
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
digitalWrite(dp, LOW);
}
else if(digit1==3) {
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
digitalWrite(dp, LOW);
}
else if(digit1==4) {
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(dp, LOW);
}
else if(digit1==5) {
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(dp, LOW);
}
else if(digit1==6) {
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(dp, LOW);
}
else if(digit1==7) {
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(dp, LOW);
}
else if(digit1==8) {
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(dp, LOW);
}
else if(digit1==9) {
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
digitalWrite(dp, LOW);
}
}

arduino bluetooth rc car using case switch statment

I build a bluetooth controled car that i have some problem with the code to it. Im using a switch case Statements to control it from my phone. The code works fine but i got a problem with the default: i want it to stop the car if it doesn't receive anything via the bluetooth. My code doesent seem to execute the default: at all. and i dont know whats the problem.
well here is my code.
int IN1 = 7;
int IN2 = 5;
int IN3 = 4;
int IN4 = 2;
int inByte = 0;
void setup() {
Serial.begin(9600);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}
void loop() {
//read my bluetooth
if (Serial.available() > 0) {
inByte = Serial.read();
Serial.print("I received: ");
Serial.println(inByte);
switch (inByte) {
case 'i':
Serial.println("forward");
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
break;
case 'j':
Serial.println("left");
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
case 'l':
Serial.println("right");
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
break;
case 'k':
Serial.println("reverse");
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
break;
default:
Serial.println("stop");
digitalWrite(IN1, HIGH);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, HIGH);
}
}
}

Arduino 5V Stepper Motor Moving Extremely Slowly

I have a Stepper Motor 5V 4-Phase 5-Wire and a driver board for it.
Unfortunately, I do not have the schematics and cannot find them anywhere on the internet for the driver board. Anyways, I connected everything as it was supposed to be and punched in the code (see below), and it works fine but it spins at about 20 RPM, which is horribly slow.
I cannot decrease the time for delayMicroseconds() anymore because if I do, the motor stops spinning, and starts to just vibrate loudly. Please help, I am stuck:
(Port 8 is connected to IN1 on the driver, Port 9 is in IN2, port 10 is
in IN3, and port 11 is in IN4)
int Pin0 = 8;
int Pin1 = 9;
int Pin2 = 10;
int Pin3 = 11;
int _step = 0;
boolean dir = true;// gre
void setup()
{
pinMode(Pin0, OUTPUT);
pinMode(Pin1, OUTPUT);
pinMode(Pin2, OUTPUT);
pinMode(Pin3, OUTPUT);
}
void loop()
{
switch(_step){
case 0:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, HIGH);
break;
case 1:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, HIGH);
digitalWrite(Pin3, HIGH);
break;
case 2:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, HIGH);
digitalWrite(Pin3, LOW);
break;
case 3:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, HIGH);
digitalWrite(Pin2, HIGH);
digitalWrite(Pin3, LOW);
break;
case 4:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, HIGH);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
break;
case 5:
digitalWrite(Pin0, HIGH);
digitalWrite(Pin1, HIGH);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
break;
case 6:
digitalWrite(Pin0, HIGH);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
break;
case 7:
digitalWrite(Pin0, HIGH);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, HIGH);
break;
default:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
break;
}
if(dir){
_step++;
}else{
_step--;
}
if(_step>7){
_step=0;
}
if(_step<0){
_step=7;
}
delayMicroseconds(800);
}

Function-definition is not allowed here before '{' token

I have been working with this simple program trying to fix this error for way too long. I am working with an Arduino and I just want to make an easy temperature monitor to turn some switches on and off. I keep getting the error "Function-definition is not allowed here before '{' token." If someone who knows more than I do and can help me out, that would be great!
float temp;
void setup(){
pinMode(13, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(7, INPUT);
pinMode(0, INPUT);
Serial.begin(9600);
}
void highHeat(){
temp = analogRead(0);
temp = (5.0*temp*100.0/1024.0);
if (temp > 79)
{
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(13, LOW);
}
if (temp < 78)
{
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(13, HIGH);
}
delay(10000);
}
void lowHeat(){
temp = analogRead(0);
temp = (5.0*temp*100.0/1024.0);
if (temp > 26)
{
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(13, LOW);
}
if (temp < 25)
{
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(13, HIGH);
}
delay(10000);
}
void loop(){
if (6 == HIGH)
{
delay(2000);
if (6 == HIGH)
{
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
void loop(){
lowHeat();
}
}
if (6 == LOW)
{
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
void loop(){
highHeat();
}
}
}
}
P.S. I've done some searching and found many posts with the same title, but they never seem to be relevant to my problem, so I just thought I would ask for a little help.
You have:
digitalWrite(13, LOW);
void loop(){
lowHeat();
}
The compiler is complaining about the void loop() there. You can't define a function in the middle of another one.

Resources