Хранение и секвенирование выходного значения (arduino)
Я новичок в программировании Arduino, после дней и ночей,когда я пытался использовать array, для цикла и гугля много статей, я все еще не могу найти способ, как хранить каждое выходное значение взвешивания из int Sampling (), которое будет выполняться соответствующим сервоприводом в порядке последовательности. Если у вас есть какие-то подсказки, которыми вы можете поделиться и помочь мне, я буду очень счастлив. Большое спасибо!.
Ниже приведен мой базовый код.
#include <HX711.h>
///////////////////////////////////////////////////////////////////////
#define calibration_factor -251
#define LOADCELL_DOUT_PIN 7 // data
#define LOADCELL_SCK_PIN 8 // sck
////////////////////////////////////////////////////////////////////////
HX711 scale;
////////////////////////////////////////////////////////////////////////
int servo1 = 12;
int servo2 = 13;
int proxiPin1 = 2;
int proxiPin2 = 3;
////////////////////////////////////////////////////////////////////////
int toggleState = 0;
int proxiState1 = 1;
int proxiState2 = 1;
////////////////////////////////////////////////////////////////////////
int weight;
int weightFinal;
////////////////////////////////////////////////////////////////////////
void setup()
{
Serial.begin(9600);
scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
scale.set_scale(calibration_factor);
scale.tare();
pinMode(servo1, OUTPUT); // simulating servo1
pinMode(servo2, OUTPUT); // simulating servo2
pinMode(proxiPin1, INPUT_PULLUP); // proximity
pinMode(proxiPin2, INPUT_PULLUP); // proximity
}
/////////////////////////////////////////////////////////////////////////
void loop()
{
Serial.print(Sampling());
Serial.print(" gram");
Serial.println();
///////////////////////////////////////////////////////////////////////
if ( weightFinal == 10 )
{
toggleState = true;
servo10gr();
}
if ( weightFinal == 20 )
{
toggleState = true;
servo20gr();
}
}
////////////////////////////////////////////////////////////////////////
int Sampling()
{
int weight = scale.get_units();
if (weight >= 10 && weight< 20)
{
weightFinal = 10;
}
else if (weight >= 20 && weight < 30)
{
weightFinal = 20;
}
return weight;
}
/////////////////////////////////////////////////////////////////////////
int servo10gr()
{
proxiState1 = digitalRead(proxiPin1);
if ( proxiState1 == 0 && toggleState == true )
{
digitalWrite(servo1, HIGH); //Simulating servo signal Pin//
delay(500);
digitalWrite(servo1, LOW);
toggleState = false;
weightFinal=0;
}
}
/////////////////////////////////////////////////////////////////////////
int servo20gr()
{
proxiState2 = digitalRead(proxiPin2);
if ( proxiState2 == 0 && toggleState == true )
{
digitalWrite(servo2, HIGH); //Simulating servo signal Pin//
delay(500);
digitalWrite(servo2, LOW);
toggleState = false;
weightFinal=0;
}
}
@FlipFlop, 👍1
Обсуждение1 ответ
Я все еще не совсем уверен, чего вы хотите достичь, но, возможно, это поможет:
У вас есть глобальная переменная int weight, и в int Sampling() вы создаете другую int weight = scale.get_units (), которой вы присваиваете значение.
Эта вторая переменная доступна только внутри функции Sampling(). Если вы хотите использовать его в другом месте для хранения или в других функциях, измените:
int вес = масштаб.get_units();
чтобы
вес = scale.get_units();
и затем вы можете использовать вес везде, где вам нравится в своем коде, также в servo10gr() и servo20gr().
Вам не нужно хранить последовательность весовs, чтобы управлять сервоприводами; вы можете сразу использовать текущий вес, чтобы управлять сервоприводом, а затем получить новый вес.
Однако, если по какой-то причине вы хотите или вам нужно сохранить список весов, нужно сделать еще немного работы.
Есть лучшие способы решить эту проблему, но давайте сначала посмотрим, решит ли это вашу проблему.
Прежде всего, я хотел бы поблагодарить вас за вашу доброту. Я попытаюсь описать это по-другому. Что я хочу сделать, так это, если бы мое выходное значение каждого объекта (по шкале) было, скажем: 10гр>10гр>>20гр>>>20гр>>>>20гр>>>>>>10гр>>>>>>>>>> и так далее, я хочу, чтобы каждый объект(в зависимости от его веса) присваивался сервоприводу на основе его обозначения servo, в данном случае "servo10gr ()" или " servo20gr ()". Должен ли я использовать "массив" или другой метод для хранения этих значений, чтобы эти задания сервоприводов выполнялись последовательно сервомоторами?. Хорошо, я попробую другой метод, используя " вес "внутри" servo10gr () " и "servo20gr"., @FlipFlop
@FlipFlop насколько я понимаю ваше требование, этот ответ не решит вашу проблему. Вам нужны массивы, потому что вы хотите хранить "кучу" значений. Однако то, что объяснил ocrdu, имеет отношение к делу. Поскольку массивы не могут быть переданы в качестве аргументов функции, вам нужно будет сделать их глобальными., @Sim Son
Спасибо тебе, Сим сын, за твою готовность давать мне советы., @FlipFlop
- Замена нескольких выводов pinMode() и digitalWrite() на массив
- Работает ли конструкция int array[100] = {0} на Arduino?
- Массив динамического размера в качестве члена класса
- Итерация массива объектов
- Как получить размер (sizeof) массива структур
- Работает с gcc, но не с Arduino. ошибка: taking address of temporary array
- Безопасно ли использовать std::array (из C++ STL) на Arduino? Использует ли он динамическое выделение памяти?
- Как запустить функцию каждый 10-й раз через цикл?
Для чего вам нужен " вес`? Серво-функции его не используют. И что вы подразумеваете под "каждым выходом взвешивания [...] в порядке последовательности"? Вы хотите сохранить его в массиве? Пожалуйста, опишите, чего вы хотите достичь., @Sim Son
Я имитирую конвейер. Поэтому сначала весы взвешивают каждое значение объекта, а затем объект отправляют через конвейер до тех пор, пока объект, отделенный сервоприводом, не будет зависеть от веса объекта. Я использую бесконтактный переключатель для запуска сервопривода. В приведенном выше коде я использую LED для моделирования сервоприводов,чтобы сделать код короче. Если я использую только приведенный выше код, я не могу взвесить новый объект перед предыдущим объектом, выполненным сервоприводом. Если я это сделаю, будет выполнен только последний вес, поэтому предыдущий объект, который уже находится на конвейере, будет выполнен неправильным сервоприводом. Спасибо!, @FlipFlop
Скорость вашего цикла зависит от того, выполняется ли задержка(500) внутри ваших сервофункций или нет. Я думаю, что это трудно контролировать должным образом., @DataFiddler
Я использую LED для имитации функции servo() в приведенном выше коде, поэтому я использую delay(). На самом деле я использую сервопривод. Моя главная проблема заключается в том, как сохранить значение веса каждого объекта для последующего выполнения назначенным сервоприводом. Некоторые люди советуют мне использовать массив. Но через неделю я не могу понять, как интегрировать кнопку/ бесконтактный переключатель с "for loop" ., @FlipFlop
Похоже, вам нужно узнать, что такое массивы и как их использовать (объяснение их на SE зашло бы слишком далеко). Важно иметь в виду, что типичный
loop()выполняется тысячи раз в секунду. Есть некоторые основные концепции (такие как BlinkWithoutDelay и конечные машины), которые облегчают вашу жизнь., @Sim SonСпасибо вам за ваше предложение, @Sim Son. Да, мне нужно узнать гораздо больше о том, как реализовать " структуры` в программе., @FlipFlop