'countof' was not declared in this scope
7 berichten
• Pagina 1 van 1
- bertgroothuis
- Berichten: 23
- Geregistreerd: 24 Jul 2020, 14:55
'countof' was not declared in this scope
Goedendag,
Op internet kwam ik een leuk project tegen om macro foto's te maken.
Meneer Ronald Schaten uit Duitsland heeft op deze site https://www.schatenseite.de/en/
zijn project ten toon gesteld. Het project heet: PhotoStepper — Step Motors and Cameras.
Ik ben bezig om dit te gaan maken maar de software geeft een foutmelding op regel 57.
exit status 1 'countof' was not declared in this scope
countof word inderdaad niet genoemd in de declaraties.
Mijn programmeer kennis is onvoldoende om dit te herstellen. Ronald Schaten regaeert niet op mails door mij verzonden.
Genoemde libraries zijn goed geinstalleerd.
Wie kan en wil hier eens naar kijken?
Bedankt.
Bert
De code:
/*
* PhotoStepper -- https://www.0x50.de/rschaten/photostepper
*
* PhotoStepper © 2022 by Ronald Schaten is licensed under CC BY-NC 4.0.
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc/4.0/
*
*/
// this project makes heavy use of the following libraries:
// - https://www.arduino.cc/reference/en/lib ... u-library/
// - https://www.arduino.cc/reference/en/lib ... perdriver/
// - https://www.arduino.cc/reference/en/lib ... logkeypad/
#include <Arduino.h>
#include <AnalogKeypad.h>
#include <BasicStepperDriver.h>
#include <menu.h>
#include <menuIO/liquidCrystalOut.h>
#include <menuIO/serialIO.h>
#include "Jogrunner.h"
#include "Scenerunner.h"
// analog keypad
#define PIN_BUTTON A0
#define KEY_RIGHT 0
#define KEY_UP 1
#define KEY_DOWN 2
#define KEY_LEFT 3
#define KEY_SELECT 4
// 2x16 LCD
#define PIN_LCD_DB4 4
#define PIN_LCD_DB5 5
#define PIN_LCD_DB6 6
#define PIN_LCD_DB7 7
#define PIN_LCD_RS 8
#define PIN_LCD_EN 9
#define PIN_LCD_BL 10
// stepper motor
#define PIN_STEPPER_DIR A1
#define PIN_STEPPER_STEP A2
// camera
#define PIN_CAMERA_FOCUS A3
#define PIN_CAMERA_SHUTTER A4
// motor configuration
#define STEPPER_STEPS 200
#define STEPPER_RPM 120
#define STEPPER_MICROSTEPS 1
#define STEPPER_ACCEL 2000
#define STEPPER_DECEL 1000
#define MAX_DEPTH 2
const int KeypadMap[] = {0, 96, 250, 402, 636};
const uint16_t KeypadHoldTimeMs = 1000;
const uint8_t KeypadAnalogPin = PIN_BUTTON;
AnalogKeypad keypad(KeypadAnalogPin, KeypadMap, countof(KeypadMap), KeypadHoldTimeMs);
LiquidCrystal lcd(PIN_LCD_RS, PIN_LCD_EN, PIN_LCD_DB4, PIN_LCD_DB5, PIN_LCD_DB6, PIN_LCD_DB7);
BasicStepperDriver stepper(STEPPER_STEPS, PIN_STEPPER_DIR, PIN_STEPPER_STEP);
enum State { STATE_MENU, STATE_JOG, STATE_RUN };
State state = STATE_MENU;
Jogrunner jogrunner(&lcd, &stepper, STEPPER_RPM);
Scenerunner scenerunner(&lcd, &stepper, PIN_CAMERA_FOCUS, PIN_CAMERA_SHUTTER, PIN_LCD_BL);
// ===
// Order of menu entries looks chaotic. It makes sense on screen.
// This is because serial IO (which is used since ArduinoMenu doesn't support
// analog keypad) doesn't implement setFieldMode().
result enter_jog() {
Serial.println("enter_jog()");
state = STATE_JOG;
jogrunner.start();
return proceed;
}
result enter_run() {
Serial.println("enter_run()");
state = STATE_RUN;
scenerunner.start();
return proceed;
}
TOGGLE(scenerunner.bReturn, setReturn, "Return: ", doNothing, noEvent, wrapStyle
,VALUE("On", true, doNothing, noEvent)
,VALUE("Off", false, doNothing, noEvent)
);
TOGGLE(scenerunner.bDarkenLcd, setLcdBlackout, "DarkenLCD: ", doNothing, noEvent, wrapStyle
,VALUE("On", true, doNothing, noEvent)
,VALUE("Off", false, doNothing, noEvent)
);
MENU(configuration, "Configuration", doNothing, anyEvent, wrapStyle
,FIELD(scenerunner.tSettle, "tSettle", "ms", 0, 2000, 100, 10, doNothing, noEvent, wrapStyle)
,EXIT("<Back")
,SUBMENU(setLcdBlackout)
,SUBMENU(setReturn)
,FIELD(scenerunner.tShutter, "tShutter", "ms", 0, 2000, 100, 10, doNothing, noEvent, wrapStyle)
,FIELD(scenerunner.tFocus, "tFocus", "ms", 0, 2000, 100, 10, doNothing, noEvent, wrapStyle)
);
MENU(scene, "Scene", doNothing, anyEvent, wrapStyle
,FIELD(scenerunner.nSteps, "nSteps", "steps", 0, 100, 10, 1, doNothing, noEvent, wrapStyle)
,EXIT("<Back")
,FIELD(scenerunner.distance, "distance", "mm", 0.1, 10, 1, 0.1, doNothing, noEvent, wrapStyle)
);
MENU(mainMenu, "PhotoStepper", doNothing, noEvent, wrapStyle
,OP("Jog", enter_jog, enterEvent)
,OP("Run", enter_run, enterEvent)
,SUBMENU(scene)
,SUBMENU(configuration)
);
MENU_OUTPUTS(out, MAX_DEPTH
,LIQUIDCRYSTAL_OUT(lcd, {0, 0, 16, 2})
,NONE
);
serialIn in(Serial);
NAVROOT(nav, mainMenu, MAX_DEPTH, in, out);
// ===
void ButtonHandler_menu(const ButtonParam& param) {
Serial.print("ButtonHandler_menu(");
Serial.print(param.button);
Serial.print(") - ");
switch (param.state) {
case ButtonState_Click:
Serial.println("Click");
switch (param.button) {
case KEY_UP:
nav.doNav(upCmd);
break;
case KEY_DOWN:
nav.doNav(downCmd);
break;
case KEY_SELECT:
nav.doNav(enterCmd);
break;
}
nav.doOutput();
break;
default:
Serial.println(param.state);
}
}
void ButtonHandler_jog(const ButtonParam& param) {
Serial.print("ButtonHandler_jog(");
Serial.print(param.button);
Serial.print(") - ");
switch (param.state) {
case ButtonState_Click:
Serial.println("Click");
switch (param.button) {
case KEY_SELECT:
state = STATE_MENU;
mainMenu.dirty = true;
break;
}
nav.doOutput();
break;
case ButtonState_Up:
Serial.println("Up");
jogrunner.stop();
break;
case ButtonState_Down:
Serial.println("Down");
switch (param.button) {
case KEY_UP:
jogrunner.forward();
break;
case KEY_DOWN:
jogrunner.backward();
break;
}
break;
case ButtonState_Hold:
Serial.println("Hold");
jogrunner.setSpeed(HIGH);
switch (param.button) {
case KEY_UP:
jogrunner.forward();
break;
case KEY_DOWN:
jogrunner.backward();
break;
}
break;
default:
Serial.println();
}
}
void ButtonHandler_run(const ButtonParam& param) {
Serial.print("ButtonHandler_run(");
Serial.print(param.button);
Serial.print(") - ");
switch (param.state) {
default:
Serial.println();
stepper.stop();
stepper.setRPM(STEPPER_RPM);
state = STATE_MENU;
mainMenu.dirty = true;
nav.doOutput();
break;
}
}
void setup() {
Serial.begin(115200);
while(!Serial);
Serial.println("PhotoStepper -- schatenseite.de");
// control backlight
pinMode(PIN_LCD_BL, OUTPUT);
digitalWrite(PIN_LCD_BL, HIGH);
// setup camera connection
pinMode(PIN_CAMERA_FOCUS, OUTPUT);
digitalWrite(PIN_CAMERA_FOCUS, LOW);
pinMode(PIN_CAMERA_SHUTTER, OUTPUT);
digitalWrite(PIN_CAMERA_SHUTTER, LOW);
stepper.begin(STEPPER_RPM, STEPPER_MICROSTEPS);
stepper.setSpeedProfile(stepper.LINEAR_SPEED, STEPPER_ACCEL, STEPPER_DECEL);
lcd.begin(16,2);
lcd.print("PhotoStepper");
lcd.setCursor(0, 1);
lcd.print("schatenseite.de");
delay(2000);
nav.doOutput();
}
void loop() {
switch (state) {
case STATE_MENU:
keypad.loop(ButtonHandler_menu);
break;
case STATE_JOG:
keypad.loop(ButtonHandler_jog);
stepper.nextAction();
break;
case STATE_RUN:
keypad.loop(ButtonHandler_run);
stepper.nextAction();
scenerunner.nextAction();
if (!scenerunner.isBusy()) {
state = STATE_MENU;
mainMenu.dirty = true;
nav.doOutput();
}
break;
}
}
Op internet kwam ik een leuk project tegen om macro foto's te maken.
Meneer Ronald Schaten uit Duitsland heeft op deze site https://www.schatenseite.de/en/
zijn project ten toon gesteld. Het project heet: PhotoStepper — Step Motors and Cameras.
Ik ben bezig om dit te gaan maken maar de software geeft een foutmelding op regel 57.
exit status 1 'countof' was not declared in this scope
countof word inderdaad niet genoemd in de declaraties.
Mijn programmeer kennis is onvoldoende om dit te herstellen. Ronald Schaten regaeert niet op mails door mij verzonden.
Genoemde libraries zijn goed geinstalleerd.
Wie kan en wil hier eens naar kijken?
Bedankt.
Bert
De code:
/*
* PhotoStepper -- https://www.0x50.de/rschaten/photostepper
*
* PhotoStepper © 2022 by Ronald Schaten is licensed under CC BY-NC 4.0.
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc/4.0/
*
*/
// this project makes heavy use of the following libraries:
// - https://www.arduino.cc/reference/en/lib ... u-library/
// - https://www.arduino.cc/reference/en/lib ... perdriver/
// - https://www.arduino.cc/reference/en/lib ... logkeypad/
#include <Arduino.h>
#include <AnalogKeypad.h>
#include <BasicStepperDriver.h>
#include <menu.h>
#include <menuIO/liquidCrystalOut.h>
#include <menuIO/serialIO.h>
#include "Jogrunner.h"
#include "Scenerunner.h"
// analog keypad
#define PIN_BUTTON A0
#define KEY_RIGHT 0
#define KEY_UP 1
#define KEY_DOWN 2
#define KEY_LEFT 3
#define KEY_SELECT 4
// 2x16 LCD
#define PIN_LCD_DB4 4
#define PIN_LCD_DB5 5
#define PIN_LCD_DB6 6
#define PIN_LCD_DB7 7
#define PIN_LCD_RS 8
#define PIN_LCD_EN 9
#define PIN_LCD_BL 10
// stepper motor
#define PIN_STEPPER_DIR A1
#define PIN_STEPPER_STEP A2
// camera
#define PIN_CAMERA_FOCUS A3
#define PIN_CAMERA_SHUTTER A4
// motor configuration
#define STEPPER_STEPS 200
#define STEPPER_RPM 120
#define STEPPER_MICROSTEPS 1
#define STEPPER_ACCEL 2000
#define STEPPER_DECEL 1000
#define MAX_DEPTH 2
const int KeypadMap[] = {0, 96, 250, 402, 636};
const uint16_t KeypadHoldTimeMs = 1000;
const uint8_t KeypadAnalogPin = PIN_BUTTON;
AnalogKeypad keypad(KeypadAnalogPin, KeypadMap, countof(KeypadMap), KeypadHoldTimeMs);
LiquidCrystal lcd(PIN_LCD_RS, PIN_LCD_EN, PIN_LCD_DB4, PIN_LCD_DB5, PIN_LCD_DB6, PIN_LCD_DB7);
BasicStepperDriver stepper(STEPPER_STEPS, PIN_STEPPER_DIR, PIN_STEPPER_STEP);
enum State { STATE_MENU, STATE_JOG, STATE_RUN };
State state = STATE_MENU;
Jogrunner jogrunner(&lcd, &stepper, STEPPER_RPM);
Scenerunner scenerunner(&lcd, &stepper, PIN_CAMERA_FOCUS, PIN_CAMERA_SHUTTER, PIN_LCD_BL);
// ===
// Order of menu entries looks chaotic. It makes sense on screen.
// This is because serial IO (which is used since ArduinoMenu doesn't support
// analog keypad) doesn't implement setFieldMode().
result enter_jog() {
Serial.println("enter_jog()");
state = STATE_JOG;
jogrunner.start();
return proceed;
}
result enter_run() {
Serial.println("enter_run()");
state = STATE_RUN;
scenerunner.start();
return proceed;
}
TOGGLE(scenerunner.bReturn, setReturn, "Return: ", doNothing, noEvent, wrapStyle
,VALUE("On", true, doNothing, noEvent)
,VALUE("Off", false, doNothing, noEvent)
);
TOGGLE(scenerunner.bDarkenLcd, setLcdBlackout, "DarkenLCD: ", doNothing, noEvent, wrapStyle
,VALUE("On", true, doNothing, noEvent)
,VALUE("Off", false, doNothing, noEvent)
);
MENU(configuration, "Configuration", doNothing, anyEvent, wrapStyle
,FIELD(scenerunner.tSettle, "tSettle", "ms", 0, 2000, 100, 10, doNothing, noEvent, wrapStyle)
,EXIT("<Back")
,SUBMENU(setLcdBlackout)
,SUBMENU(setReturn)
,FIELD(scenerunner.tShutter, "tShutter", "ms", 0, 2000, 100, 10, doNothing, noEvent, wrapStyle)
,FIELD(scenerunner.tFocus, "tFocus", "ms", 0, 2000, 100, 10, doNothing, noEvent, wrapStyle)
);
MENU(scene, "Scene", doNothing, anyEvent, wrapStyle
,FIELD(scenerunner.nSteps, "nSteps", "steps", 0, 100, 10, 1, doNothing, noEvent, wrapStyle)
,EXIT("<Back")
,FIELD(scenerunner.distance, "distance", "mm", 0.1, 10, 1, 0.1, doNothing, noEvent, wrapStyle)
);
MENU(mainMenu, "PhotoStepper", doNothing, noEvent, wrapStyle
,OP("Jog", enter_jog, enterEvent)
,OP("Run", enter_run, enterEvent)
,SUBMENU(scene)
,SUBMENU(configuration)
);
MENU_OUTPUTS(out, MAX_DEPTH
,LIQUIDCRYSTAL_OUT(lcd, {0, 0, 16, 2})
,NONE
);
serialIn in(Serial);
NAVROOT(nav, mainMenu, MAX_DEPTH, in, out);
// ===
void ButtonHandler_menu(const ButtonParam& param) {
Serial.print("ButtonHandler_menu(");
Serial.print(param.button);
Serial.print(") - ");
switch (param.state) {
case ButtonState_Click:
Serial.println("Click");
switch (param.button) {
case KEY_UP:
nav.doNav(upCmd);
break;
case KEY_DOWN:
nav.doNav(downCmd);
break;
case KEY_SELECT:
nav.doNav(enterCmd);
break;
}
nav.doOutput();
break;
default:
Serial.println(param.state);
}
}
void ButtonHandler_jog(const ButtonParam& param) {
Serial.print("ButtonHandler_jog(");
Serial.print(param.button);
Serial.print(") - ");
switch (param.state) {
case ButtonState_Click:
Serial.println("Click");
switch (param.button) {
case KEY_SELECT:
state = STATE_MENU;
mainMenu.dirty = true;
break;
}
nav.doOutput();
break;
case ButtonState_Up:
Serial.println("Up");
jogrunner.stop();
break;
case ButtonState_Down:
Serial.println("Down");
switch (param.button) {
case KEY_UP:
jogrunner.forward();
break;
case KEY_DOWN:
jogrunner.backward();
break;
}
break;
case ButtonState_Hold:
Serial.println("Hold");
jogrunner.setSpeed(HIGH);
switch (param.button) {
case KEY_UP:
jogrunner.forward();
break;
case KEY_DOWN:
jogrunner.backward();
break;
}
break;
default:
Serial.println();
}
}
void ButtonHandler_run(const ButtonParam& param) {
Serial.print("ButtonHandler_run(");
Serial.print(param.button);
Serial.print(") - ");
switch (param.state) {
default:
Serial.println();
stepper.stop();
stepper.setRPM(STEPPER_RPM);
state = STATE_MENU;
mainMenu.dirty = true;
nav.doOutput();
break;
}
}
void setup() {
Serial.begin(115200);
while(!Serial);
Serial.println("PhotoStepper -- schatenseite.de");
// control backlight
pinMode(PIN_LCD_BL, OUTPUT);
digitalWrite(PIN_LCD_BL, HIGH);
// setup camera connection
pinMode(PIN_CAMERA_FOCUS, OUTPUT);
digitalWrite(PIN_CAMERA_FOCUS, LOW);
pinMode(PIN_CAMERA_SHUTTER, OUTPUT);
digitalWrite(PIN_CAMERA_SHUTTER, LOW);
stepper.begin(STEPPER_RPM, STEPPER_MICROSTEPS);
stepper.setSpeedProfile(stepper.LINEAR_SPEED, STEPPER_ACCEL, STEPPER_DECEL);
lcd.begin(16,2);
lcd.print("PhotoStepper");
lcd.setCursor(0, 1);
lcd.print("schatenseite.de");
delay(2000);
nav.doOutput();
}
void loop() {
switch (state) {
case STATE_MENU:
keypad.loop(ButtonHandler_menu);
break;
case STATE_JOG:
keypad.loop(ButtonHandler_jog);
stepper.nextAction();
break;
case STATE_RUN:
keypad.loop(ButtonHandler_run);
stepper.nextAction();
scenerunner.nextAction();
if (!scenerunner.isBusy()) {
state = STATE_MENU;
mainMenu.dirty = true;
nav.doOutput();
}
break;
}
}
Advertisement
- Gij Kieken
- Berichten: 636
- Geregistreerd: 15 Nov 2015, 11:54
Re: 'countof' was not declared in this scope
Hey Bert,
De fout die je krijgt komt waarschijnlijk door een verkeerd of onvolledig geinstalleerde bibliotheek AnalogKeypad.
countof, wordt zeg maar omschreven in AnalogKeypad.h
De fout die je krijgt komt waarschijnlijk door een verkeerd of onvolledig geinstalleerde bibliotheek AnalogKeypad.
countof, wordt zeg maar omschreven in AnalogKeypad.h
Re: 'countof' was not declared in this scope
en dat countof kan een typefout zijn dus alle libs nakijken of nagaan waar het probeleempje zit dus de eerste fout opzoeken en dan elke fout oplossen.
paul deelen
shooter@home.nl
shooter@home.nl
- bertgroothuis
- Berichten: 23
- Geregistreerd: 24 Jul 2020, 14:55
Re: 'countof' was not declared in this scope
Gij Kieken schreef:Hey Bert,
De fout die je krijgt komt waarschijnlijk door een verkeerd of onvolledig geinstalleerde bibliotheek AnalogKeypad.
countof, wordt zeg maar omschreven in AnalogKeypad.h
Hoi Gij,
Ik heb even diverse andere bibliotheken geprobeerd maar dat lost helaas niets op.
Bert
Re: 'countof' was not declared in this scope
Probeer het eens met -countof dus met een underscore er voor
- bertgroothuis
- Berichten: 23
- Geregistreerd: 24 Jul 2020, 14:55
Re: 'countof' was not declared in this scope
OPGELOST.
Op de site van Ronald Schaten uit Duitsland noemt hij een andere bibliotheek dan in de sketch.
AnalogKeypad by Makuna (v1.1.1) for reading input keys Op zijn site.
AnalogKeypad 0.2.1 Via de sketch https://www.arduino.cc/reference/en/lib ... logkeypad/
Deze werkt dus: AnalogKeypad by Makuna
Allen bedankt voor het meedenken.
Bert
Op de site van Ronald Schaten uit Duitsland noemt hij een andere bibliotheek dan in de sketch.
AnalogKeypad by Makuna (v1.1.1) for reading input keys Op zijn site.
AnalogKeypad 0.2.1 Via de sketch https://www.arduino.cc/reference/en/lib ... logkeypad/
Deze werkt dus: AnalogKeypad by Makuna
Allen bedankt voor het meedenken.
Bert
- Gij Kieken
- Berichten: 636
- Geregistreerd: 15 Nov 2015, 11:54
Re: 'countof' was not declared in this scope
Fijn om te horen dat het werkt.
7 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 21 gasten