Хранение и секвенирование выходного значения (arduino)

c++ array loop

Я новичок в программировании 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;
  }
}

, 👍1

Обсуждение

Для чего вам нужен " вес`? Серво-функции его не используют. И что вы подразумеваете под "каждым выходом взвешивания [...] в порядке последовательности"? Вы хотите сохранить его в массиве? Пожалуйста, опишите, чего вы хотите достичь., @Sim Son

Я имитирую конвейер. Поэтому сначала весы взвешивают каждое значение объекта, а затем объект отправляют через конвейер до тех пор, пока объект, отделенный сервоприводом, не будет зависеть от веса объекта. Я использую бесконтактный переключатель для запуска сервопривода. В приведенном выше коде я использую LED для моделирования сервоприводов,чтобы сделать код короче. Если я использую только приведенный выше код, я не могу взвесить новый объект перед предыдущим объектом, выполненным сервоприводом. Если я это сделаю, будет выполнен только последний вес, поэтому предыдущий объект, который уже находится на конвейере, будет выполнен неправильным сервоприводом. Спасибо!, @FlipFlop

Скорость вашего цикла зависит от того, выполняется ли задержка(500) внутри ваших сервофункций или нет. Я думаю, что это трудно контролировать должным образом., @DataFiddler

Я использую LED для имитации функции servo() в приведенном выше коде, поэтому я использую delay(). На самом деле я использую сервопривод. Моя главная проблема заключается в том, как сохранить значение веса каждого объекта для последующего выполнения назначенным сервоприводом. Некоторые люди советуют мне использовать массив. Но через неделю я не могу понять, как интегрировать кнопку/ бесконтактный переключатель с "for loop" ., @FlipFlop

Похоже, вам нужно узнать, что такое массивы и как их использовать (объяснение их на SE зашло бы слишком далеко). Важно иметь в виду, что типичный loop() выполняется тысячи раз в секунду. Есть некоторые основные концепции (такие как BlinkWithoutDelay и конечные машины), которые облегчают вашу жизнь., @Sim Son

Спасибо вам за ваше предложение, @Sim Son. Да, мне нужно узнать гораздо больше о том, как реализовать " структуры` в программе., @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