Хранение и секвенирование выходного значения (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