Go Down

Topic: Arduino Problem (Read 595 times) previous topic - next topic

Leendert-Jan

'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
}

AWOL

#1
Dec 16, 2018, 12:11 am Last Edit: Dec 16, 2018, 12:12 am by AWOL
Why is it so very, very difficult to use code tags?

It looks like you have a ton (tonne) of stuff not in functions.
"Pete, it's a fool (who) looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.
I speak for myself, not Arduino.

Deva_Rishi

Het eerste wat me opvalt is dat je de loop() al na
Code: [Select]
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.
To 'Correct' you have to be Correct. (and not be condescending..)

MAS3

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):

Code: [Select]
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 ?
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

shooter

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.

paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

Leendert-Jan

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

Deva_Rishi

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:
Code: [Select]
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.)
To 'Correct' you have to be Correct. (and not be condescending..)

Leendert-Jan

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;

Leendert-Jan

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;

Deva_Rishi

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
Code: [Select]
#define MEASURE_TIME 4000         // measure every  4 seconds
en bereken de rpm zo
Code: [Select]
rpm       = puls * 15;  // 15 * het aantal pulsjes per 4 secs is het aantal pulsjes per minuut

To 'Correct' you have to be Correct. (and not be condescending..)

shooter

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.
paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

Go Up