Arduino Problem

'rpm_as' was not declared in this scope

That is my problem.
For a school project i need to make a kart that brakes all by itself, using a LIDAR distance meter and the speed of the kart.

I have a switch with a LED that indicates which stand is on, because i want to be able to change the stand because of wheater circumstances. The LED, and the switch, worked perfectly but when i changed a few things it gave an error : 'rpm_as' was not declared in this scope. I don't know what i did wrong can anybody help me?

My code:

#include <LiquidCrystal.h>

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address

#define MEASURE_TIME 1000 // measure every second
#define WIEL_OMTREK 3000 // wiel omtrek in millimeter

unsigned long triggerTijd; // testen voor elke MEASURE_TIME
unsigned long snelheid = 0;
unsigned long maxsnelheid = 0;
volatile unsigned int puls = 0; //volatile wordt altijd gebruikt in combi met een interupt, het vertelt de compiler
// om gegevens direct uit RAM te halen en niet uit een tijdelijk register
unsigned long rpm = 0L;
unsigned long wielomtrek = 0L; // long is een variabele waar grote getallen in kunnen ook negatieve getallen.
unsigned long afstand = 0L;
unsigned long maxafstand = 0L;
/**

  • @name setup()
    */
    int LED = 4;

void setup() {
//
// we have no LCD so do serial
pinMode(5, OUTPUT);
pinMode(10, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
Serial.begin(115200); // Opent een seriële verbindingspoort.
lcd.begin(20, 4); // Stelt de LCD in 16 kolommen en 2 rijen.
attachInterrupt(0, rpm_as, FALLING); // vallende puls als trigger
triggerTijd = millis() + MEASURE_TIME;// start de timer
int distance = 11; // geen eenheid erachter want is input en geen constante
pinMode(LED,OUTPUT);
}

void loop() {
int sensorVal10 = digitalRead(10);
int sensorVal11 = digitalRead(11);
} ////////////////////////////////////////////////////////////////////////Stand van het programma
lcd.clear(0, 0);
lcd.setCursor(14, 3);
lcd.print("Stnd");
//////////////////////////////////////////////////////////////////schakeling van standen
if (sensorVal10 == HIGH) {
digitalWrite(7, LOW);
lcd.setCursor(19, 3);
lcd.print("1");
}
if (sensorVal10 == LOW) {
digitalWrite(7, HIGH);
}
if (sensorVal11 == HIGH) {
digitalWrite(8, LOW);
lcd.setCursor(19, 3);
lcd.print("2");
}
if (sensorVal10 == HIGH) {
digitalWrite(8, HIGH);
}
if (sensorVal11 == LOW);
(sensorVal10 == LOW);
{
digitalWrite(8, LOW);
digitalWrite(7, LOW);
}
///////////////////////////////////////////////////////////////////////////////snelheid en LCD
int distance = 11;

if (millis() > triggerTijd) {
// bereken het aaltal RPM per minuut
//
rpm = puls * 60;
snelheid = ((WIEL_OMTREK * rpm * 60) / (1000000)); // Reken de snelheid uit.
afstand = (WIEL_OMTREK * puls); // Reken de afgelegde afstand uit.
maxafstand= (afstand + maxafstand);

//Hieronder wordt de hoogste waarde van de variabele "maxsnelheid" onthouden.
if (snelheid > maxsnelheid)
maxsnelheid = snelheid;
if (snelheid < maxsnelheid)
maxsnelheid = maxsnelheid;

lcd.setCursor(0, 0);
lcd.print("Speed");
lcd.setCursor(14, 0); // Zet de cursor op de gewenste plaats, kolom4(5) en rij1(0).
lcd.print("Km/h"); // Schrijf de tekst tussen de "".
lcd.setCursor(10, 0);
lcd.print(snelheid); // Schrijf de variabele "snelheid".

lcd.setCursor(0, 1);
lcd.print("Fastest Km/h");
lcd.setCursor(10, 1);
lcd.print(maxsnelheid);
lcd.setCursor(0, 2);
lcd.print("Distance");
lcd.setCursor(10, 2);
lcd.print(distance);
lcd.setCursor(14, 2);
lcd.print("m");
lcd.setCursor(0,3);
lcd.print("Danger");
lcd.setCursor(10,4);
if (distance < snelheid) /////////////////// hier neerzeten if (distance < remweg + remweg/10)
{
lcd.print("YES");
digitalWrite(LED,HIGH);
}

if (distance > snelheid) /////////////////// hier neerzeten if (distance < remweg + remweg/10)
{
lcd.print("NO");
digitalWrite(LED,LOW);
digitalWrite(5, HIGH);
}
else {
digitalWrite(5, LOW);
}
puls = 0;
triggerTijd = millis() + MEASURE_TIME; // start de timer
}
}
/**

  • @name rpm_as
  • wordt aangeroepen bij elke trigger van de hall sensor
    */
    void rpm_as() {
    puls++; // verhoog de teller
    }

Why is it so very, very difficult to use code tags?

It looks like you have a ton (tonne) of stuff not in functions.

Het eerste wat me opvalt is dat je de loop() al na

void loop() {
  int sensorVal10 = digitalRead(10);
  int sensorVal11 = digitalRead(11);
  } ////////////////////////////////////////////////////////////////////////Stand van het programma
 lcd.clear(0, 0);

3 regels beeindigd, dat krul-haakje hoort daar vast niet. Ook helpt het als je code-tags om je code heen zet.

foute krul-haakjes leveren vreemde foutmeldingen op. Goed indenteren helpt om deze fouten op te sporen.

Nog een tipje:

Wanneer je aan je code gaat werken met de Arduino IDE, kun je terugvinden welke {gekrulde haakjes} bij elkaar horen.
Zet je de cursor naast het ene haakje door er direct rechts naast te klikken, dan wordt het bijbehorende haakje gemarkeerd door er een klein blauw kadertje omheen te zetten.
Zo kun je vrij eenvoudig dit soort fouten opsporen.
En ga er maar van uit dat je dit veel vaker gaat tegenkomen.

Dit stukje van jouw code doet vast ook niet wat je ermee bedoelde, ik vermoed dat daar 2 verschillende fouten in zitten (alhoewel ik ook niet kan weten wat er allemaal uit jouw meesterbrein kan ontspruiten):

if (sensorVal11 == LOW);
  (sensorVal10 == LOW);
  {
    digitalWrite(8, LOW);
    digitalWrite(7, LOW);
  }

Ik neem aan dat je de code nog zal gaan uitbreiden, want de functie rpm_as is wat twijfelachtig wat mij betreft.

Zoals je bemerkt, zullen er hier geen kant en klare oplossingen voor je problemen worden aangedragen.
Maar we zullen je wel proberen de juiste kant op te gaan met je gedachten.
Zo ga je wel zelf het probleem oplossen en dan leer je pas echt.
En das wat de bedoeling was van je schoolopdracht, toch ?

helemaal ondraan doe je rpm_as gebruiken als functie.
maar daar gaat wat fout ergens boven deze functie. en dus wordt rpm_as gezien als variabele maar dat is het niet.

Ja ik zie het inderdaad, bedankt!

De snelheid die ik in dit programma heb staan, bereken ik met een hall sensor. De snelheid die ik hiermee bereken gaat met stapten van 11. Zo krijg ik dus bij mn langzaamste beweging met een magneetje langs de sensor al een snelheid van 10 Km/u en de eerstvolgende snelheid die de lcd aangeeft is 21 en ga zo maar door.
Waar ligt dit aan in mijn code?
Of ligt het aan mijn lcd? Liikt mij heel sterk want de snelheden die hij aangeeft zijn steeds dezelfde
Ik heb de wielomtrek nog niet veranderd maar hij dat zou niet perse uit moeten maken

Ik denk dat een update van je code hier zodat we weer even kunnen kijken of alles klopt.
Ik denk dat je probleem wordt veroorzaakt hiierdoor:

 if (millis() > triggerTijd) {
    // bereken het aaltal RPM per minuut
    //
    rpm       = puls * 60;
    snelheid  = ((WIEL_OMTREK * rpm * 60) / (1000000)); // Reken de snelheid uit.
    afstand   = (WIEL_OMTREK * puls);                   // Reken de afgelegde afstand uit.
    maxafstand= (afstand + maxafstand);

je meet het aantal pulsjes in een seconde,
daarvan maak je een aantal omwentelingen per minuut.
voor elke omwenteling meer krijg jee een stap in de snelheid. Je zal een nauwkeurigere meeting moeten doen.
je moet elke seconde een meting doen van het aantal pulsjes in de minuut voorafgaande aan het meet moment. dat betekent dat je elke keer vergelijkt met de situatie een minuut eerder. (of je moet veel meer pulsjes versturen dmv meer sensor pings per omwenteling.)

ik heb het nu veranderd en het blijkt te werken. Ik heb de wiel_omtrek veranderd naar 300, en nu krijg ik keurig een minimaal snelheidsverschil van 1 km/u. Maar mijn wielomtrek is 889 en bij deze omtrek, krijg ik een minimaal snelheidsverschil van 3 km/u...

Ik snap het ff niet meer iemand die het weet?

Code hierbij:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address

#define MEASURE_TIME 1000 // measure every second
#define WIEL_OMTREK 889 // wiel omtrek in millimeter

unsigned long triggerTijd; // testen voor elke MEASURE_TIME
unsigned long snelheid = 0;
unsigned long maxsnelheid = 0;
volatile unsigned int puls = 0; //volatile wordt altijd gebruikt in combi met een interupt, het vertelt de compiler
// om gegevens direct uit RAM te halen en niet uit een tijdelijk register
unsigned long rpm = 0L;
unsigned long wielomtrek = 0L; // long is een variabele waar grote getallen in kunnen ook negatieve getallen.
unsigned long afstand = 0L;
unsigned long maxafstand = 0L;
/**
@name setup()
*/
int LED = 4;
int LED2 = 5;
int LED_s1 = 7;
int LED_s2 = 8;
int Schakelaarkant_1 = 9;
int Schakelaarkant_2 = 10;

void setup() {

lcd.begin(20, 4); // Stelt de LCD in 16 kolommen en 2 rijen.
attachInterrupt(0, rpm_as, FALLING); // vallende puls als trigger
triggerTijd = millis() + MEASURE_TIME; // start de timer
int distance = 11; // geen eenheid erachter want is input en geen constante
pinMode(LED, OUTPUT);
Serial.begin(9600);
while (! Serial);
Serial.println("Starting...");
}

void loop() {
int sensorVal10 = digitalRead(Schakelaarkant_1);
int sensorVal11 = digitalRead(Schakelaarkant_2);
////////////////////////////////////////////////////////////////////////Stand van het programma
lcd.setCursor(14, 3);
lcd.print("Stnd");
//////////////////////////////////////////////////////////////////schakeling van standen
if (sensorVal10 == HIGH) {
digitalWrite(LED_s1, LOW);
lcd.setCursor(19, 3);
lcd.print("2");
}
if (sensorVal10 == LOW) {
digitalWrite(LED_s1, HIGH);
}
if (sensorVal11 == HIGH) {
digitalWrite(LED_s2, LOW);
lcd.setCursor(19, 3);
lcd.print("1");
}
if (sensorVal10 == HIGH) {
digitalWrite(LED_s2, HIGH);
}
if (sensorVal11 == LOW);
(sensorVal10 == LOW);
{
digitalWrite(LED_s2, LOW);
digitalWrite(LED_s1, LOW);
}
///////////////////////////////////////////////////////////////////////////////snelheid en LCD
int distance = 11;

if (millis() > triggerTijd) {
// bereken het aaltal RPM per minuut
rpm = puls * 60;
snelheid = ((WIEL_OMTREK * rpm * 60) / (1000000)); // Reken de snelheid uit.
afstand = (WIEL_OMTREK * puls); // Reken de afgelegde afstand uit.
maxafstand = (afstand + maxafstand);

//Hieronder wordt de hoogste waarde van de variabele "maxsnelheid" onthouden.
if (snelheid > maxsnelheid)
maxsnelheid = snelheid;
if (snelheid < maxsnelheid)
maxsnelheid = maxsnelheid;

Het gaat vooral hierom natuurlijk

Code hierbij:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address

#define MEASURE_TIME 1000 // measure every second
#define WIEL_OMTREK 889 // wiel omtrek in millimeter

unsigned long triggerTijd; // testen voor elke MEASURE_TIME
unsigned long snelheid = 0;
unsigned long maxsnelheid = 0;
volatile unsigned int puls = 0; //volatile wordt altijd gebruikt in combi met een interupt, het vertelt de compiler
// om gegevens direct uit RAM te halen en niet uit een tijdelijk register
unsigned long rpm = 0L;
unsigned long wielomtrek = 0L; // long is een variabele waar grote getallen in kunnen ook negatieve getallen.
unsigned long afstand = 0L;
unsigned long maxafstand = 0L;

void setup() {

lcd.begin(20, 4); // Stelt de LCD in 16 kolommen en 2 rijen.
attachInterrupt(0, rpm_as, FALLING); // vallende puls als trigger
triggerTijd = millis() + MEASURE_TIME; // start de timer
}

void loop() {

if (millis() > triggerTijd) {
// bereken het aaltal RPM per minuut
rpm = puls * 60;
snelheid = ((WIEL_OMTREK * rpm * 60) / (1000000)); // Reken de snelheid uit.
afstand = (WIEL_OMTREK * puls); // Reken de afgelegde afstand uit.
maxafstand = (afstand + maxafstand);

//Hieronder wordt de hoogste waarde van de variabele "maxsnelheid" onthouden.
if (snelheid > maxsnelheid)
maxsnelheid = snelheid;
if (snelheid < maxsnelheid)
maxsnelheid = maxsnelheid;

Als j code-tags </> gebruikt is de code wat makkelijker leesbaar. Als je wiel omtrek inderdaad groter is dan ontvang je te weinig pulsjes per seconde om met stapjes van 1km/u je snelheid te bepalen, je resolutie is dan gewoon te laag, je kan de resolutie ook verhogen door over een langere periode te meten, waarschijnlijk is meten over een periode van 3 of 4 seconden wel genoeg.
verander dit

#define MEASURE_TIME 4000         // measure every  4 seconds

en bereken de rpm zorpm      = puls * 15;  // 15 * het aantal pulsjes per 4 secs is het aantal pulsjes per minuut

snelheid is dus aantal pulsen/per tijd (ofwel zorgb dat je elke puls meet en dan de tijd die daarvoor nodig was, of tel het aantal pulsen per seconde. Op een gegeven moment moet je omschakelen.