Ошибка массива Arduino
Я пишу программу, в которой есть подпрограмма, которая сохраняет значения в массив, но подпрограмма, которая сохраняет значения в массив, возвращается с ошибкой, сообщающей мне, что массив не объявлен в этой области. Я довольно новичок в этом и самоучка, но даже когда я пытаюсь передать массив в подпрограмму, я получаю ту же ошибку. Я уверен, что это довольно простая очевидная ошибка, которую я совершаю, но я просто не могу заставить ее работать.
мы будем очень признательны за любую помощь.
Если кто-нибудь увидит какие-либо другие ошибки или лучшие способы для меня написать что-либо из этого, любая помощь будет высоко оценена, поскольку я все еще не уверен в том, что я должен делать.
#include <HX711.h>
#include <Wire.h> // IC2 Связь
#include <LiquidCrystal_I2C.h> //LCD
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4); // Change to (0x27,16,2) for 16x2 LCD.
int max_load;
int interval;
int max_load_prev;
int interval_prev;
int mode;
int handle_weight;
int tip_weight;
int stop1;
int mode_previous;
int interval_sum;
int mode1 = 53;
int mode2 = 51;
int mode3 = 49;
int start1 = 39;
int start2 = 37;
int increment = 47;
float potentiometer1 = A0;
float potentiometer2 = A1;
int tare_1 = 45;
int tare_2 = 43;
//stepper motor controller
int stepPin = 12;
int dirPin = 13;
//sensor readings
HX711 tip_read;
HX711 handle_read;
int DOUT_tip = 6;
int DOUT_handle = 5;
int CLK_tip = 4;
int CLK_handle = 3;
void setup() {
// put your setup code here, to run once:
lcd.init();
lcd.backlight();
//saving to array//
float data_storage_array[600][3];
pinMode(mode1, INPUT);
pinMode(mode2, INPUT);
pinMode(mode3, INPUT);
pinMode(start1, INPUT);
pinMode(start2, INPUT);
pinMode(increment, INPUT);
pinMode(stop1, INPUT);
pinMode(potentiometer1, INPUT);
pinMode(potentiometer2, INPUT);
//sesnor readings
tip_read.begin(DOUT_tip, CLK_tip);
tip_read.set_scale(55);// change to calibration factor
handle_read.begin(CLK_tip,CLK_handle);
handle_read.set_scale(55);// change to calibration factor
pinMode(tare_1, INPUT);
pinMode(tare_2, INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
mode_previous = 0;
interval = 25;
max_load_prev = 0;
interval_prev = 0;
interval_sum = 0;
while (digitalRead(start1) == 0){
if (digitalRead(mode1) == 1){
mode = 1;
}
if (digitalRead(mode2) == 1){
mode = 2;
}
if (digitalRead(mode3) == 1){
mode = 3;
}
if (mode_previous != mode){
Display_mode_set_up(mode);
mode_previous = mode;
}
if (digitalRead(increment) == 1){
delay(500);
if (interval >= 1000){
interval = 25;
}
else if (interval < 1000){
interval = interval + 25;
}
}
max_load = max_load_reading();
if (max_load_prev != max_load or interval_prev != interval){
Display_value_set_up(max_load, interval, mode);
max_load_prev = max_load;
interval_prev = interval;
}
Display_output(handle_weight, tip_weight);
tare_one();
}
if (mode == 1){
mode_one(max_load, tip_weight);
}
else if (mode == 2){
mode_two(max_load, interval, handle_weight, tip_weight);
}
else if (mode ==3){
mode_three(max_load, interval, handle_weight, tip_weight);
}
Pause_stop();
}
//---SUB ROUTINES---
void mode_one(int max_load, int tip_weight){
tip_weight = read_tip();
while (tip_weight < max_load){
tip_weight = read_tip();
turn_motor();
Pause_stop();
Display_output(handle_weight, tip_weight);
}
}
void mode_two(int max_load, int interval, int handle_weight, int tip_weight){
int aim_value;
aim_value = 0 + interval;
tip_weight = read_tip;
while (tip_weight < max_load){
while (tip_weight < aim_value){
turn_motor();
Pause_stop();
Display_output(handle_weight, tip_weight);
tip_weight = read_tip();
}
save_to_array(interval_sum);
aim_value = aim_value + interval;
while (digitalRead(start2) == 0){
delay(1);
}
}
send_values_to_pc();
}
void mode_three(int max_load, int interval, int handle_weight, int tip_weight){
int aim_value;
aim_value = 0 + interval;
tip_weight = read_tip();
while (tip_weight < max_load){
while (tip_weight < aim_value){
turn_motor();
Pause_stop();
Display_output(handle_weight, tip_weight);
tip_weight = read_tip();
}
save_to_array(interval_sum);
aim_value = aim_value + interval;
delay(10000);
}
send_values_to_pc();
}
void tare_one(){
if (tare_1 == HIGH) {
tip_read.tare();
}
if (tare_2 == HIGH) {
handle_read.tare();
}
}
void turn_motor(){
digitalWrite(dirPin, HIGH);
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
digitalWrite(stepPin, LOW);
delayMicroseconds(500);
}
int read_tip(){
int weight;
weight = tip_read.get_units();
return weight;
}
int read_handle(){
int weight;
weight = handle_read.get_units();
return weight;
}
void save_to_array(int interval_sum){
data_storage_array[interval_sum][0] = interval_sum;
data_storage_array[interval_sum][1] = tip_read.get_units();
data_storage_array[interval_sum][2] = handle_read.get_units();
interval_sum = interval_sum + 1;
}
void send_values_to_pc(){
}
int max_load_reading(){
int KG_value;
int g_value;
int load_max;
KG_value = analogRead(potentiometer1);
g_value = analogRead(potentiometer2);
KG_value = KG_value * 2;
KG_value = KG_value/ 100;
KG_value = round(KG_value);
KG_value = KG_value* 100;
g_value = g_value/ 10;
g_value = round(g_value);
if (g_value >= 100){
g_value = 99;
}
load_max = KG_value + g_value;
return load_max;
}
void Pause_stop(){
if (digitalRead(stop1) == 1){
delay(1000);
while (digitalRead(start1) == 0){
if (digitalRead(stop1) == 1){
motor_unwind();
}
else{
delay(100);
lcd.setCursor(0, 2);
lcd.print("Program Paused");
}
}
lcd.setCursor(0, 2);
lcd.print(" ");
}
}
void motor_unwind(){
tip_weight = read_tip();
while (tip_weight < 100){
digitalWrite(dirPin, LOW);
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
digitalWrite(stepPin, LOW);
delayMicroseconds(500);
}
int count = 100;
while (count > 0){
digitalWrite(dirPin, LOW);
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
digitalWrite(stepPin, LOW);
delayMicroseconds(500);
count = count -1;
}
}
void Display_mode_set_up(int mode){
lcd.setCursor(0, 0);
if (mode == 1){
lcd.print("Mode: Max ");
lcd.setCursor(0, 1);
lcd.print("MLoad:");
lcd.setCursor(12, 1);
lcd.print("inti:---");
}
if (mode == 2){
lcd.print("Mode: Incrimental ");
lcd.setCursor(0, 1);
lcd.print("MLoad:");
lcd.setCursor(12, 1);
lcd.print("inti: ");
}
if (mode == 3){
lcd.print("Mode: Automatic ");
lcd.setCursor(0, 1);
lcd.print("MLoad:");
lcd.setCursor(12, 1);
lcd.print("inti: ");
}
lcd.setCursor(0, 3);
lcd.print("Tip:");
lcd.setCursor(9, 3);
lcd.print("Handle:");
}
void Display_value_set_up(int max_load, int interval, int mode){
if (mode == 1){
lcd.setCursor(6, 1);
lcd.print(" ");
lcd.setCursor(6, 1);
lcd.print(max_load);
}
if (mode == 2 or mode == 3){
lcd.setCursor(6, 1);
lcd.print(" ");
lcd.setCursor(6, 1);
lcd.print(max_load);
lcd.setCursor(17, 1);
lcd.print(" ");
lcd.setCursor(17, 1);
lcd.print(interval);
}
}
void Display_output(int handle_weight, int tip_weight){
tip_weight = read_tip();
handle_weight = read_handle();
lcd.setCursor(4, 3);
lcd.print(tip_weight);
lcd.setCursor(16, 3);
lcd.print(handle_weight);
}
@Jacob Huggins, 👍2
Обсуждение2 ответа
Вы объявляете float data_storage_array[600][3] в setup () и используете его в другой функции, которая не может "видеть" его. Самый простой способ заставить его работать-сделать ваш массив глобальным, объявив его вверху в разделе, где вы объявляете другие переменные, такие как max_load.
Как уже упоминали другие, ваш массив находится вне области видимости и может быть использован только в функции setup()
. Я перенес это из функции setup()
в раздел глобальных переменных.
Я также с осторожностью отношусь к тому, сколько SRAM вы использовали с вашими (600 x 3 =) 1800 элементами с плавающей запятой. Поэтому я изменил его на целые числа и уменьшил до 250 x 3. Вы указали, что используете Arduino Mega, так что при необходимости это можно было бы расширить.
Ваша переменная interval_sum
была настроена на увеличение без верхнего предела. Это означает, что в конечном итоге вы выйдете за пределы массива. Я это исправил.
Я кратко просмотрел ваш код и добавил некоторые исправления и некоторые комментарии. Это непроверено. Я надеюсь, что это поможет вам.
#include <HX711.h>
#include <Wire.h> // Связь IC2
#include <LiquidCrystal_I2C.h> //ЖК-дисплей
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4); // Изменить на (0x27,16,2) для ЖК-дисплея 16x2.
int max_load;
int interval;
int max_load_prev;
int interval_prev;
int mode;
int handle_weight;
int tip_weight;
int stop1;
int mode_previous;
int interval_sum;
const int mode1 = 53; // <-- добавлено ключевое слово const ко всем определениям контактов, поскольку они не изменяют
const int mode2 = 51;
const int mode3 = 49;
const int start1 = 39;
const int start2 = 37;
const int increment = 47;
const int potentiometer1 = A0; // <- Изменен на int, поскольку это только определение контакта
const int potentiometer2 = A1; // <- Изменен на int, поскольку это только определение контакта
const int tare_1 = 45;
const int tare_2 = 43;
//контроллер шагового двигателя
const int stepPin = 12;
const int dirPin = 13;
//показания датчиков
HX711 tip_read;
HX711 handle_read;
int DOUT_tip = 6;
int DOUT_handle = 5;
int CLK_tip = 4;
int CLK_handle = 3;
// сохранение в массив//
int data_storage_array[250][3]; // <-- Перемещен перед установкой(). Изменено на int. Уменьшено до 250x3 элементов.
void setup() {
// поместите свой установочный код здесь, чтобы запустить один раз:
lcd.init();
lcd.backlight();
pinMode(mode1, INPUT);
pinMode(mode2, INPUT);
pinMode(mode3, INPUT);
pinMode(start1, INPUT);
pinMode(start2, INPUT);
pinMode(increment, INPUT);
pinMode(stop1, INPUT);
pinMode(potentiometer1, INPUT);
pinMode(potentiometer2, INPUT);
// сесноровские чтения
tip_read.begin(DOUT_tip, CLK_tip);
tip_read.set_scale(55);// изменить на калибровочный коэффициент
handle_read.begin(CLK_tip,CLK_handle);
handle_read.set_scale(55);// изменить на калибровочный коэффициент
pinMode(tare_1, INPUT);
pinMode(tare_2, INPUT);
}
void loop() {
// поместите сюда свой основной код для повторного запуска:
mode_previous = 0;
interval = 25;
max_load_prev = 0;
interval_prev = 0;
interval_sum = 0;
while (digitalRead(start1) == 0){
if (digitalRead(mode1) == 1){
mode = 1;
}
if (digitalRead(mode2) == 1){
mode = 2;
}
if (digitalRead(mode3) == 1){
mode = 3;
}
if (mode_previous != mode){
Display_mode_set_up(mode);
mode_previous = mode;
}
if (digitalRead(increment) == 1){
delay(500);
if (interval >= 1000){
interval = 25;
}
else if (interval < 1000){
interval = interval + 25;
}
}
max_load = max_load_reading();
if (max_load_prev != max_load or interval_prev != interval){
Display_value_set_up(max_load, interval, mode);
max_load_prev = max_load;
interval_prev = interval;
}
Display_output(handle_weight, tip_weight);
tare_one();
}
if (mode == 1){
mode_one(max_load, tip_weight);
}
else if (mode == 2){
mode_two(max_load, interval, handle_weight, tip_weight);
}
else if (mode ==3){
mode_three(max_load, interval, handle_weight, tip_weight);
}
Pause_stop();
}
//--- ПОДПРОГРАММЫ---
void mode_one(int max_load, int tip_weight){
tip_weight = read_tip();
while (tip_weight < max_load){
tip_weight = read_tip();
turn_motor();
Pause_stop();
Display_output(handle_weight, tip_weight);
}
}
void mode_two(int max_load, int interval, int handle_weight, int tip_weight){
int aim_value;
aim_value = 0 + interval;
tip_weight = read_tip;
while (tip_weight < max_load){
while (tip_weight < aim_value){
turn_motor();
Pause_stop();
Display_output(handle_weight, tip_weight);
tip_weight = read_tip();
}
save_to_array(); // <-- Удалена глобальная переменная
aim_value = aim_value + interval;
while (digitalRead(start2) == 0){
delay(1);
}
}
send_values_to_pc();
}
void mode_three(int max_load, int interval, int handle_weight, int tip_weight){
int aim_value;
aim_value = 0 + interval;
tip_weight = read_tip();
while (tip_weight < max_load){
while (tip_weight < aim_value){
turn_motor();
Pause_stop();
Display_output(handle_weight, tip_weight);
tip_weight = read_tip();
}
save_to_array(); // <-- Удалена глобальная переменная
aim_value = aim_value + interval;
delay(10000);
}
send_values_to_pc();
}
void tare_one(){
if (tare_1 == HIGH) {
tip_read.tare();
}
if (tare_2 == HIGH) {
handle_read.tare();
}
}
void turn_motor(){
digitalWrite(dirPin, HIGH);
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
digitalWrite(stepPin, LOW);
delayMicroseconds(500);
}
int read_tip(){
int weight;
weight = tip_read.get_units();
return weight;
}
int read_handle(){
int weight;
weight = handle_read.get_units();
return weight;
}
void save_to_array(){ // <-- Глобальная переменная удалена
data_storage_array[interval_sum][0] = interval_sum;
data_storage_array[interval_sum][1] = tip_read.get_units();
data_storage_array[interval_sum][2] = handle_read.get_units();
if (interval_sum >= 249){ // <-- Добавил этот оператор if, поскольку не было способа ограничить это число
interval_sum = 0;
}
else{
interval_sum = interval_sum + 1;
}
}
void send_values_to_pc(){
}
int max_load_reading(){
int KG_value;
int g_value;
int load_max;
KG_value = analogRead(potentiometer1);
g_value = analogRead(potentiometer2);
KG_value = KG_value * 2;
KG_value = KG_value/ 100;
KG_value = round(KG_value);
KG_value = KG_value* 100;
g_value = g_value/ 10;
g_value = round(g_value);
if (g_value >= 100){
g_value = 99;
}
load_max = KG_value + g_value;
return load_max;
}
void Pause_stop(){
if (digitalRead(stop1) == 1){
delay(1000);
while (digitalRead(start1) == 0){
if (digitalRead(stop1) == 1){
motor_unwind();
}
else{
delay(100);
lcd.setCursor(0, 2);
lcd.print("Program Paused");
}
}
lcd.setCursor(0, 2);
lcd.print(" ");
}
}
void motor_unwind(){
tip_weight = read_tip();
while (tip_weight < 100){
digitalWrite(dirPin, LOW);
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
digitalWrite(stepPin, LOW);
delayMicroseconds(500);
}
int count = 100;
while (count > 0){
digitalWrite(dirPin, LOW);
digitalWrite(stepPin, HIGH);
delayMicroseconds(500);
digitalWrite(stepPin, LOW);
delayMicroseconds(500);
count = count -1;
}
}
void Display_mode_set_up(int mode){
lcd.setCursor(0, 0);
if (mode == 1){
lcd.print("Mode: Max ");
lcd.setCursor(0, 1);
lcd.print("MLoad:");
lcd.setCursor(12, 1);
lcd.print("inti:---");
}
if (mode == 2){
lcd.print("Mode: Incrimental ");
lcd.setCursor(0, 1);
lcd.print("MLoad:");
lcd.setCursor(12, 1);
lcd.print("inti: ");
}
if (mode == 3){
lcd.print("Mode: Automatic ");
lcd.setCursor(0, 1);
lcd.print("MLoad:");
lcd.setCursor(12, 1);
lcd.print("inti: ");
}
lcd.setCursor(0, 3);
lcd.print("Tip:");
lcd.setCursor(9, 3);
lcd.print("Handle:");
}
void Display_value_set_up(int max_load, int interval, int mode){
if (mode == 1){
lcd.setCursor(6, 1);
lcd.print(" ");
lcd.setCursor(6, 1);
lcd.print(max_load);
}
if (mode == 2 or mode == 3){
lcd.setCursor(6, 1);
lcd.print(" ");
lcd.setCursor(6, 1);
lcd.print(max_load);
lcd.setCursor(17, 1);
lcd.print(" ");
lcd.setCursor(17, 1);
lcd.print(interval);
}
}
void Display_output(int handle_weight, int tip_weight){
tip_weight = read_tip();
handle_weight = read_handle();
lcd.setCursor(4, 3);
lcd.print(tip_weight);
lcd.setCursor(16, 3);
lcd.print(handle_weight);
}
- Получение шестнадцатеричных данных с терминала
- Использование массивов и светодиодов для представления фортепианных гамм
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
- Как получить уникальный идентификатор для всех плат Arduino?
Погуглите “область действия C++” и немного почитайте о том, что означает область действия переменной. Все это довольно быстро обретет смысл., @Delta_G