Why did my arduino program suddenly stop working? - arduino

So I have a project to make for school in which we had to make an arduino project from scratch. I'm relatively new to arduino and his coding and made a simple, yet fun project. I had the idea of making a sort of safe where you have to enter a key and after that, use a potentiometer to make the right combination to open the safe. I don't know what I did wrong but when I uploaded it to my arduino, the program got to the first lines and stopped after printing the first line to the serial monitor. There the program is stuck and doesn't do anything. The weird thing is that it worked 5 minutes ago but now it just wont. Can anyone help me please? My deadline is in a few hours and I can't fix it... Here is the code and a schematic:
Picture of the setup. The 2 resistors on the left are 1k, the other 2 are 10k.
//variabelen
const int pot = A0;
const int pinA = 6;
const int pinB = 5;
const int pinC = 2;
const int pinD = 3;
const int pinE = 4;
const int pinF = 7;
const int pinG = 8;
const int pinP = 9;
const int enter = 11;
const int reset = 12;
byte enterState = 0;
byte lastEnterState = 0;
byte resetState = 0;
byte lastResetState = 0;
int enterTimer = 0;
String wachtwoord;
String ingegeven = "";
//setup
void setup(){
pinMode(pinA, OUTPUT);
pinMode(pinB, OUTPUT);
pinMode(pinC, OUTPUT);
pinMode(pinD, OUTPUT);
pinMode(pinE, OUTPUT);
pinMode(pinF, OUTPUT);
pinMode(pinG, OUTPUT);
pinMode(pinP, OUTPUT);
pinMode(enter, INPUT);
pinMode(reset, INPUT);
Serial.begin(9600);
Serial.println("Geef een wachtwoord op voor de safe.");
wachtwoord = Serial.read();
}
//eigen methoden
void dispChar(int getal){
switch(getal){
case 0:
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, HIGH);
break;
case 1:
digitalWrite(pinA, HIGH);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
break;
case 2:
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, HIGH);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, LOW);
break;
case 3:
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, LOW);
break;
case 4:
digitalWrite(pinA, HIGH);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
break;
case 5:
digitalWrite(pinA, LOW);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
break;
case 6:
digitalWrite(pinA, LOW);
digitalWrite(pinB, HIGH);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
break;
case 7:
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, HIGH);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, HIGH);
digitalWrite(pinG, HIGH);
break;
case 8:
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, LOW);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
break;
case 9:
digitalWrite(pinA, LOW);
digitalWrite(pinB, LOW);
digitalWrite(pinC, LOW);
digitalWrite(pinD, LOW);
digitalWrite(pinE, HIGH);
digitalWrite(pinF, LOW);
digitalWrite(pinG, LOW);
break;
}
}
//Kijk of enter knop is ingedrukt
void onEnter(){
enterState = digitalRead(enter);
if(enterState == HIGH){
enterTimer++;
if(enterState != lastEnterState){
ingegeven += map(analogRead(pot), 0, 1023, 0, 9);
Serial.println(ingegeven);
enterTimer = 0;
}
}
delay(50); //Voorkomt bounce.
if(enterTimer > 50){
Serial.println("\nRESET");
enterTimer = 0;
ingegeven = "";
}
lastEnterState = enterState;
check();
}
bool check(){
if(ingegeven.equals(wachtwoord)){
return true;
} else{
if(ingegeven.length() > wachtwoord.length()){
Serial.println("FOUT!");
ingegeven = "";
return false;
}
}
}
//Kijk of reset knop is ingedrukt
void onReset(){
resetState = digitalRead(reset);
if(resetState != lastResetState){
if(resetState == HIGH){
ingegeven = "";
Serial.println("Geef een wachtwoord op voor de safe.");
wachtwoord = Serial.read();
}
}
delay(50); //Voorkomt bounce.
lastResetState = resetState;
}
//loop
void loop(){
while(!check()){
int getal = map(analogRead(pot), 0, 1023, 0, 9);
digitalWrite(pinP, HIGH);
dispChar(getal);
onEnter();
onReset();
}
Serial.println("CODE CORRECT!")
}
Thanks for the help!!

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?

"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!

changing the value of a variable multiple times and keeping that variable value throughout the entire loop in arduino

In Arduino I am having issues where I can't change the value of a variable in the void loop(). Here is the code I use:
void setup() {
pinMode(10, INPUT);
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
}
int speed = 1000;
int sub = 100;
void loop() {
if (digitalRead(13) == HIGH) {
speed = speed-sub;
} else {
speed = speed;
}
digitalWrite(0, HIGH);
digitalWrite(1, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
delay(speed);
if (digitalRead(13) == HIGH) {
speed = speed - sub;
} else {
speed = speed;
}
digitalWrite(0, LOW);
digitalWrite(1, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
delay(speed);
if (digitalRead(13) == HIGH) {
speed = speed - sub;
} else {
speed = speed;
}
digitalWrite(0, LOW);
digitalWrite(1, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
delay(speed);
}
Is there any way I can change the value of a variable multiple times during one loop and have that variable value kept until the end of the loop? Also, will I need to add a new function, and if so how should I go about it?
It seems that you want to control the speed of a running light using push button.
but in your code that is not possible because you use blocking function that will disable reading of button for a while.
i suggest you run the code in your mind line by line. then you will understood what i mean.

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);
}
}
}

Resources