A simple problem with arduino UNO about optimizing code - arduino

It this a really simple code about turning on an off some LEDs, but I want it not to be so repetititve
I've tried to make a loop, but i couldn't get it, I did my best, but I'm really bad at this :(( pls need someone's jelp
`
#define LED 2
#define LED2 3
#define LED3 4
#define LED4 5
#define LED5 6
void setup()
{
pinMode(LED, OUTPUT);
pinMode (LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
}
void loop()
{
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED2, HIGH);
delay(500);
digitalWrite(LED3, HIGH);
delay(250);
digitalWrite(LED4, HIGH);
delay(125);
digitalWrite(LED5, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(1000);
digitalWrite(LED2, LOW);
delay(500);
digitalWrite(LED3, LOW);
delay(250);
digitalWrite(LED4, LOW);
delay(125);
digitalWrite(LED5, LOW);
delay(500);
}`

I'll rewrite what Oleg Mazurov said in the comment:
#define NUMBER_OF_LEDS 5
static const uint8_t a_led[NUMBER_OF_LEDS] = {2, 3, 4, 5, 6};
static const uint16_t a_delay[NUMBER_OF_LEDS] = {1000, 500, 250, 125, 500};
void setup() {
for (int i = 0; i < NUMBER_OF_LEDS; i++) {
pinMode(a_led[i], OUTPUT);
}
}
void loop() {
for (int i = 0; i < NUMBER_OF_LEDS; i++) {
digitalWrite(a_led[i], !digitalRead(a_led[i]));
delay(a_delay[i]);
}
}

Related

"exit status 1 'microsecondsToInches' was not declared in this scope"

I'm trying to Program a Ultrasonic Sensor for a small project where I'm trying to design a level sensor. This is for a beginner mechatronic course that I'm taking right now. But it keeps giving me this error in line 42, bellow the void loop, that says:
"exit status 1'microsecondsToInches' was not declared in this scope"
#include <LiquidCrystal.h>
const int rs = 13, en = 12, d4 = 11, d5 = 10, d6 = 9, d7 = 8;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int LED1 = 7;
int LED2 = 6;
int LED3 = 5;
int LED4 = 4;
int Bocina = 3;
const int echoPin = 2;
const int trigPin = 1;
void setup() {
pinMode (LED1, OUTPUT);
digitalWrite(LED1, LOW);
pinMode(LED2, OUTPUT);
digitalWrite(LED2, LOW);
pinMode(LED3, OUTPUT);
digitalWrite(LED3, LOW);
pinMode(LED4, OUTPUT);
digitalWrite(LED4, LOW);
pinMode(Bocina, OUTPUT);
lcd.begin(16, 2);
}
void loop() {
long duration;
long inches;
long cm;
lcd.clear();
pinMode(trigPin, OUTPUT);
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
//cm = ( duration / 29 ) / 2;
//inches = cm * 0.393701;
inches = microsecondsToInches(duration);
cm = microsecondsToCentimeters(duration);
lcd.setCursor(5, 0);
lcd.print("Nivel:");
lcd.setCursor(0, 1);
lcd.print(inches);
lcd.print(" in");
}
if (inches >= 4) {
digitalWrite (LED1, HIGH);
digitalWrite (LED2, HIGH);
digitalWrite (LED3, HIGH);
digitalWrite (LED4, LOW);
}
else if (inches >= 3) {
digitalWrite (LED1, LOW);
digitalWrite (LED2, HIGH);
digitalWrite (LED3, HIGH);
digitalWrite (LED4, LOW);
}
else if (inches >= 2) {
digitalWrite (LED1, LOW);
digitalWrite (LED2, LOW);
digitalWrite (LED3, HIGH);
digitalWrite (LED4, LOW);
tone(3, 2000, 100);
delay(1000);
}
else if (inches >= 1) {
digitalWrite (LED1, LOW);
digitalWrite (LED2, LOW);
digitalWrite (LED3, LOW);
digitalWrite (LED4, HIGH);
tone(3, 2000);
}
}
long microsecondsToInches(long microseconds) {
return (microseconds / 74) / 2;
}
long microsecondsToCentimeters(long microseconds) {
return (microseconds / 29) / 2;
}
Can some explain me what's the problem here? And how to solve it?
Thanks in advance :)
Arduino didn't correctly generate the function prototypes, as you have a syntax error within the file.
You have an extra closing bracket }, right before you declare the microsecondsToInches function. Just remove it and you should be good to go
Also welcome to stack overflow!

Aurdino coding to control a motor

//Motor A
const int motorpin1 = 6; // Pin 6 of L293
const int motorpin2 = 9; // Pin 3 of L293
void setup() {
pinMode(motorpin1, OUTPUT);
pinMode(motorpin2, OUTPUT);
digitalWrite(motorpin1, LOW);
digitalWrite(motorpin2, LOW);
Serial.begin(9600);
}
// put your main code here, to run repeatedly:
void loop(){
if(Serial.available()>0)
{
char incomingByte = Serial.read();
Serial.println(incomingByte);
if(incomingByte=='a'){
digitalWrite(motorpin1, LOW);
digitalWrite(motorpin2, LOW);
delay(200);
digitalWrite(motorpin1, LOW);
digitalWrite(motorpin2, HIGH);
Serial.println("one way");
}
else if(incomingByte=='s'){
digitalWrite(motorpin1, LOW);
digitalWrite(motorpin2, LOW);
delay(200);
digitalWrite(motorpin1, HIGH);
digitalWrite(motorpin2, LOW);
Serial.println("other way");
}
else{
digitalWrite(motorpin1, LOW);
digitalWrite(motorpin2, LOW);
}
}
}
If we input a in the serial monitor the motor should rotate in one direction and if we input s the motor should rotate in another direction but it is not happening the motor is idle but i get the output like this:
a
one way
s
other way
There is no problem with hardware connections.
Could you please help me with this.Thanks in advance
According to the comments in your code, you are conecting arduino-pin-6 to the l293-pin-6, and arduino-pin-9 to the l293-pin-3.
According to this datasheet, the control pins in L293 are: 2, 7, 10, 15. So, I believe you are connecting it wrong. Also the pulses are being done in the wrong order (from HIGH to LOW and so on).
This should be the correct code (please look at the comments in the code):
//Motor A
const int motorpin1 = 6; // Pin 7 of L293
const int motorpin2 = 9; // Pin 2 of L293
const int motorenablepin = 10; // Pin 1 of L293
void setup() {
pinMode(motorpin1, OUTPUT);
pinMode(motorpin2, OUTPUT);
pinMode(motorenablepin, OUTPUT);
digitalWrite(motorpin1, LOW);
digitalWrite(motorpin2, LOW);
digitalWrite(motorenablepin, HIGH); // we can let it enabled
Serial.begin(9600);
}
// put your main code here, to run repeatedly:
void loop(){
if(Serial.available()>0)
{
char incomingByte = Serial.read();
Serial.println(incomingByte);
if(incomingByte=='a'){
digitalWrite(motorpin1, HIGH);
digitalWrite(motorpin2, LOW);
Serial.println("one way");
}
else if(incomingByte=='s'){
digitalWrite(motorpin1, HIGH);
digitalWrite(motorpin2, LOW);
Serial.println("other way");
}
delay(200);
digitalWrite(motorpin1, LOW);
digitalWrite(motorpin2, LOW);
}
}
Please note that I added the motorenablepin that was missing. It must be conected to the l293-pin-1.
Also, since the LOW and LOW states are common to the code, you can simplify it as I did.
There was small mistake in the logic:
if(incomingByte=='a'){
digitalWrite(motorpin1, LOW);
digitalWrite(motorpin2, HIGH);//changed to high
delay(10000);
digitalWrite(motorpin1, LOW);
digitalWrite(motorpin2, LOW);//changed to low
Serial.println("one way");
}
else if(incomingByte=='s'){
digitalWrite(motorpin1, LOW);
digitalWrite(motorpin2, HIGH);//changed to high
delay(2000);
digitalWrite(motorpin1, LOW);//changed to low
digitalWrite(motorpin2, LOW);

How to trigger function in arduino by using node-red?

can i trigger a function in arduino with node-red?
i tried to research it before and i couldn't find any
my arduino code is
int motor1 = 2;
int motor2 = 3;
int motor3 = 4;
int motor4 = 5;
int motor5 = 6;
int motor6 = 7;
int motor7 = 8;
int motor8 = 9;
void setup() {
pinMode(motor1, OUTPUT);
pinMode(motor2, OUTPUT);
pinMode(motor3, OUTPUT);
pinMode(motor4, OUTPUT);
pinMode(motor5, OUTPUT);
pinMode(motor6, OUTPUT);
pinMode(motor7, OUTPUT);
pinMode(motor8, OUTPUT);
}
void loop() {
yeetmotor1();
yeetmotor2();
yeetmotor3();
yeetmotor4();
}
void yeetmotor1(){
digitalWrite(motor1, HIGH);
digitalWrite(motor2, LOW);
delay(1000);
digitalWrite(motor1, LOW);
digitalWrite(motor2, LOW);
}
void yeetmotor2(){
digitalWrite(motor3, HIGH);
digitalWrite(motor4, LOW);
delay(1000);
digitalWrite(motor3, LOW);
digitalWrite(motor4, LOW);
}
void yeetmotor3(){
digitalWrite(motor5, HIGH);
digitalWrite(motor6, LOW);
delay(1000);
digitalWrite(motor5, LOW);
digitalWrite(motor6, LOW);
}
void yeetmotor4(){
digitalWrite(motor7, HIGH);
digitalWrite(motor8, LOW);
delay(1000);
digitalWrite(motor7, LOW);
digitalWrite(motor8, LOW);
}
If you have any clue for this please send help because i think it is possible to do it
Thank you for anying answering it

Arduino Nano and analog joystick

I have a game that consist of 4 direction of movement (up down left and right)
using Arduino Nano and analog joystick, seems like code is right as check before other posts.
This is the Arduino code:
byte x_axis = A3;
byte y_axis = A1;
byte btn1 = 8;
byte btn2 = 9;
byte btn3 = 10;
byte btn4 = 11;
byte btn5 = 12;
byte led = 13;
void setup(){
pinMode(x_axis, INPUT);
pinMode(y_axis, INPUT);
pinMode(btn1, INPUT);
pinMode(btn2, INPUT);
pinMode(btn3, INPUT);
pinMode(btn4, INPUT);
pinMode(btn5, INPUT);
digitalWrite(btn1, HIGH);
digitalWrite(btn2, HIGH);
digitalWrite(btn3, HIGH);
digitalWrite(btn4, HIGH);
digitalWrite(btn5, HIGH);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(9600);
}
void loop(){
Int read_x = analogRead(x_axis);
int read_y = analogRead(y_axis);
if(read_x > 600){
Serial.println("R");
digitalWrite(led, HIGH);
}
if(read_x < 400){
Serial.println("L");
digitalWrite(led, HIGH);
}
if(read_y > 600){
Serial.println("D");
digitalWrite(led, HIGH);
}
if(read_y < 400){
Serial.println("U");
digitalWrite(led, HIGH);
}
if(digitalRead(btn1) == LOW){
Serial.println("1");
digitalWrite(led, HIGH);
}
if(digitalRead(btn2) == LOW){
Serial.println("2");
digitalWrite(led, HIGH);
}
if(digitalRead(btn3) == LOW){
Serial.println("3");
digitalWrite(led, HIGH);
}
if(digitalRead(btn4) == LOW){
Serial.println("4");
digitalWrite(led, HIGH);
}
if(digitalRead(btn5) == LOW){
Serial.println("5");
digitalWrite(led, HIGH);
}
delay(10);
digitalWrite(led, LOW);
}
But when I use serial monitor to check it, it non stop show me U and L even without touching the joystick.
How can I fix this problem?
I'm feeling generous, so you have some jitter issues in the code and you really could use some cleanup. This code compiles. Ok now when a joystick is 0,0 in x/y physically it jitters in code. One thing you could do is remap out the jitter to give a wider center. print the raw analog values to the serial monitor and then map them out to your 0 point with a little padding. reference: https://www.arduino.cc/reference/en/language/functions/math/map/
byte x_axis = A3;
byte y_axis = A1;
byte btn[] = {8, 9, 10, 11, 12}; // 2,3,4,5,6
byte stat[] = {1, 2, 3, 4, 5};
byte led = 13;
int dval = 50;
void setup() {
pinMode(x_axis, INPUT);
pinMode(y_axis, INPUT);
for (int i = 0; i < 5; i++) {
pinMode(btn[i], INPUT);
digitalWrite(btn[i], HIGH);
}
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
Serial.begin(9600);
}
void loop() {
int read_x = analogRead(x_axis);
delay(dval);
int read_y = analogRead(y_axis);
delay(dval);
if (read_x > 600) {
Serial.println("R");
digitalWrite(led, HIGH);
}
if (read_x < 400) {
Serial.println("L");
digitalWrite(led, HIGH);
}
if (read_y > 600) {
Serial.println("D");
digitalWrite(led, HIGH);
}
if (read_y < 400) {
Serial.println("U");
digitalWrite(led, HIGH);
}
for (int i = 0; i < 5; i++) {
if (digitalRead(btn[i]) == LOW) {
Serial.println(stat[i]);
digitalWrite(led, HIGH);
}
}
delay(10);
digitalWrite(led, LOW);
}
Emad joon:
1- Check that the ground of your joy stick and the Vdd is connected to your arduino.
2- connect the x and y of the joy stick to the arduino analog inputs.
use this code as starter:
#define X_AXIS A1
#define Y_AXIS A3
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print("X = ");
Serial.println(analogRead(X_AXIS);
Serial.print("Y = ");
Serial.println(analogRead(Y_AXIS);
delay(150);
}
See what values you get when your Joy Stick is at initial position. You can build up on this code for buttons.
Also, do not forget to use debouncing for your button readings:
if(digitalRead(Button1)==0){
delay(40);
if(digitalRead(Button1==0){
buttonPressed=true;
}
}

How to add the Interrupt(); function to arduino code

For a small school project I am building a simulation of a traffic light system, based on three directions. What makes the system special is it can detect vehicles waiting in front of the traffic light. When a vehicle is detected, the given direction will get a green light. To do so I make use of a Hall Effect sensor.
Right now I am stuck on the following problem; the Arduino stops detecting the state of the sensor while giving a certain direction a green light. I already have read about the Interrupt() function to do certain tasks simultaneously but didn't manage to implement it in my code.
Hope you guys know a way to do so!
int sensorPin3 = 2;
int sensorPin2 = 3;
int sensorPin1 = 4;
int g1 = 11;
int y1 = 12;
int r1 = 13;
int g2 = 8;
int y2 = 9;
int r2 = 10;
int g3 = 5;
int y3 = 6;
int r3 = 7;
int counter = 0;
boolean sensorState1 = false;
boolean sensorState2 = false;
boolean sensorState3 = false;
void setup()
{
// setup serial - diagnostics - port
Serial.begin(9600);
pinMode(sensorPin1, INPUT);
pinMode(sensorPin2, INPUT);
pinMode(sensorPin3, INPUT);
digitalWrite(sensorPin1, HIGH);
digitalWrite(sensorPin2, HIGH);
digitalWrite(sensorPin3, HIGH);
pinMode(g1, OUTPUT);
pinMode(y1, OUTPUT);
pinMode(r1, OUTPUT);
pinMode(g2, OUTPUT);
pinMode(y2, OUTPUT);
pinMode(r2, OUTPUT);
pinMode(g3, OUTPUT);
pinMode(y3, OUTPUT);
pinMode(r3, OUTPUT);
}
void loop()
{
digitalWrite (r1, HIGH);
digitalWrite (r2, HIGH);
digitalWrite (r3, HIGH);
if(magnetPresent(sensorPin1) && !sensorState1)
{
sensorState1 = true;
}
else if(!magnetPresent(sensorPin1) && sensorState1)
{
if(sensorState1 = false);
Serial.println("detect1");
richting1();
}
if(magnetPresent(sensorPin2) && !sensorState2)
{
sensorState2 = true;
}
else if(!magnetPresent(sensorPin2) && sensorState2)
{
if (sensorState2 = false);
Serial.println("detect2");
richting2();
}
if(magnetPresent(sensorPin3) && !sensorState3)
{
sensorState3 = true;
}
else if(!magnetPresent(sensorPin3) && sensorState3)
{
if (sensorState3 = false);
Serial.println("detect3");
richting3();
}
}
void printMessage(String message){
counter++;
Serial.print(counter);
Serial.print(" ");
Serial.println(message);
}
boolean magnetPresent(int pin){
return digitalRead(pin) == LOW;
}
void richting1()
{
digitalWrite (r1, HIGH);
digitalWrite (r2, HIGH);
digitalWrite (r3, HIGH);
delay(2000);
digitalWrite (r1, LOW);
digitalWrite (r2, HIGH);
digitalWrite (r3, HIGH);
digitalWrite (g1, HIGH);
delay(10000);
digitalWrite (y1, HIGH);
digitalWrite (r2, HIGH);
digitalWrite (r3, HIGH);
digitalWrite (g1, LOW);
delay(2000);
digitalWrite (y1, LOW);
digitalWrite (r1, HIGH);
}
void richting2()
{
digitalWrite (r1, HIGH);
digitalWrite (r2, HIGH);
digitalWrite (r3, HIGH);
delay(2000);
digitalWrite (r2, LOW);
digitalWrite (r1, HIGH);
digitalWrite (r3, HIGH);
digitalWrite (g2, HIGH);
delay(10000);
digitalWrite (y2, HIGH);
digitalWrite (r1, HIGH);
digitalWrite (r3, HIGH);
digitalWrite (g2, LOW);
delay(2000);
digitalWrite (y2, LOW);
digitalWrite (r2, HIGH);
}
void richting3()
{
digitalWrite (r1, HIGH);
digitalWrite (r2, HIGH);
digitalWrite (r3, HIGH);
delay(2000);
digitalWrite (r3, LOW);
digitalWrite (y3, LOW);
digitalWrite (r1, HIGH);
digitalWrite (r2, HIGH);
digitalWrite (g3, HIGH);
delay(10000);
digitalWrite (y3, HIGH);
digitalWrite (r1, HIGH);
digitalWrite (r2, HIGH);
digitalWrite (g3, LOW);
delay(2000);
digitalWrite (y3, LOW);
digitalWrite (r3, HIGH);
}
#NickGammon made a great posts about interrupts and how to use them. It is more then complete so here is the link:
https://arduino.stackexchange.com/questions/30968/how-do-interrupts-work-on-the-arduino-uno-and-similar-boards
This is just a little opinion, but for traffic light codes, I found it a little simpler to make something like a custom delay. Take a look at this code and you'll hopefully understand it. Again, this was one of my school project in which I've used a template so you might see some useless crap in it!
/* This program acts like a pedestrian light. If the button is pressed, a light will turn on for a certain moment to let the person pass.
By : Dat HA
Date : 16/09/27
*/
//****************************** VARIABLES ******************************
const int leds[4][12] = //declaring leds - RED, YELLOW, GREEN
{
//R,Y,G,
{5, 6, 7}, //north
{8, 9, 10}, //east
{11, 12, 13}, //south
{2, 3, 4} //west
};
/* Sensors: sensorNumber - itemInArray - sensorDescription - pinDescription
1 - 0 - pushbutton
2 - 1 - photocell
3 - 2 - potentiometer
4 - 3 - distance - distanceEcho
5 - 4 - distance - distanceTrigger
6 - 5 - pushbutton (2)
7 - 6 - servo
*/
const int sensors[] = {A2, A7, A6, A4, A5, A3, A0}; //pin for each sensor
//****************************** SETUP ******************************
const int analogPins[6] = {A0, A1, A2, A3, A4, A5}; //for quick pinMode, distanceTrigger we be redeclared as an output is it is an analog input pin
void setup() {
for (int i = 2; i < 14; i++) //declaring digital pins as output for leds
{
pinMode(i, OUTPUT);
}
for (int i = 0; i < 6; i++) //declaring analog inputs
{
pinMode(analogPins[i], INPUT);
}
pinMode(sensors[4], OUTPUT); //declaring trigger pin as an output
}
//****************************** MAIN LOOP ******************************
int green = 5000;
int yellow = 3000;
int aa = 0;
void loop() {
//north, south
digitalWrite(leds[0][0], LOW); //red light off
digitalWrite(leds[2][0], LOW);
digitalWrite(leds[0][2], HIGH); //green light on
digitalWrite(leds[2][2], HIGH);
wait(green);
digitalWrite(leds[0][2], LOW); //green light off
digitalWrite(leds[2][2], LOW);
digitalWrite(leds[0][1], HIGH); //yellow light on
digitalWrite(leds[2][1], HIGH);
wait(yellow);
digitalWrite(leds[0][1], LOW); //yellow light off
digitalWrite(leds[2][1], LOW);
digitalWrite(leds[0][0], HIGH); //red light on
digitalWrite(leds[2][0], HIGH);
delay(100);
if (aa == 1)
{
flash();
}
//*************** SWITCHING SIDES ***************
digitalWrite(leds[1][0], LOW); //red light off
digitalWrite(leds[3][0], LOW);
digitalWrite(leds[1][2], HIGH); //green light on
digitalWrite(leds[3][2], HIGH);
wait(green);
digitalWrite(leds[1][2], LOW); //green light off
digitalWrite(leds[3][2], LOW);
digitalWrite(leds[1][1], HIGH); //yellow light on
digitalWrite(leds[3][1], HIGH);
wait(yellow);
digitalWrite(leds[1][1], LOW); //yellow light off
digitalWrite(leds[3][1], LOW);
digitalWrite(leds[1][0], HIGH); //red light on
digitalWrite(leds[3][0], HIGH);
delay(100);
if (aa == 1)
{
flash();
}
}
//****************************** FUNCTIONS ******************************
/* Usable functions list:
LEDS functions - do something to the leds
ledClear() turn all leds off
ledRedOn() turn all red leds on
ledYelOn() turn all yellow leds on
ledGreOn() turn all green leds on
SENSORS functions - they will return the apropriate value
pushButton() values: 0,1
photocell() values: 0-1023
potentiometer() values: 0-1023
distance() values: 0-200
*/
void ledClear() //turn off all leds
{
for (int i = 2; i < 14; i++)
{
digitalWrite(i, LOW); //turning leds off
}
}
void ledRedOn()
{
for (int i = 0; i < 4; i++)
{
digitalWrite(leds[i][0], HIGH); //turning red leds on
}
}
void ledRedOff()
{
for (int i = 0; i < 4; i++)
{
digitalWrite(leds[i][0], LOW); //turning red leds on
}
}
void ledYelOn()
{
for (int i = 0; i < 4; i++)
{
digitalWrite(leds[i][1], HIGH); //turning yellow leds on
}
}
void ledGreOn()
{
for (int i = 0; i < 4; i++)
{
digitalWrite(leds[i][2], HIGH); //turning green leds on
}
}
int pushButton() // sensor 1
{
int x = digitalRead(sensors[0]);
return x; //returning digital value of pushbutton which is either 0 or 1
}
void flash() //flash the red led
{
for (int i = 0; i < 12; i++)
{
ledGreOn();
ledRedOn(); //on
delay(200); //wait
ledRedOff(); //off
delay(200); //wait
}
ledClear();
aa = 0;
}
int wait(int x) //see if the wire is disconnected and if so, flash the red led
{
int i = 0;
unsigned long currentMillis = millis(); //current time
while (millis() - currentMillis <= x) //delay
{
if (digitalRead(A2) == HIGH) //if wire disconnected
{
aa = 1;
}
}
}

Resources