Помогите. Обработать сценарий

Sic20101
Offline
Зарегистрирован: 30.06.2015

Помогите пожалуйста не опытному новичку.

Делаю скеч основанный на флагах (1 и 0) данных, и никак не могу сообразить, в тупике.
Вообщем есть разные данные, которые я привожу в вид 1 или 0, и загоняю в массив. И тут меня заклинило. Как грамотно взять массив, полностью его прочитать. А дальше по его виду, обработать сценарий. тоесть получил 011001 надо сделать это и это, получил 110001 надо сделать другое.
Что не читаю, везде его перебирают да и только. 
Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

публикуй код, что и куда ты там загоняешь и что собрался брать

Sic20101
Offline
Зарегистрирован: 30.06.2015
class volt
{
	int pin;
	int v1;//pokazaniya ACP
	float real_v;//V do delitelya
	float min_v;//nighniy pridel
	float aj_v;//pogrehnost
	int flag_v;//signal o min_v
	
	public:
  volt(int pin, float aj_v, float min_v)
  {
    pin=pin;
    min_v=min_v;
    aj_v=aj_v;
  }
	float real=real_v;
	int flag=flag_v;

  void read_v()
  {
    v1=analogRead(pin);
    real_v=v1*aj_v*5/1023;
      if(min_v>=real_v)
      {
      flag_v=1;
      }
      else
      {
        flag_v=0;
      }
  }

};

class timer
{
	int b1;
	int b2;
	unsigned long t2;
	unsigned long t3;
	
	public:
	timer(int b1, int b2, unsigned long t2)
	{
		b1=b1;
		b2=b2;
		t2=t2;
	}
	int flag_zum=b2;
	int flag_start=b1;
	
	void zummer()
	{
		unsigned long t1= millis();
		if(b1==1 && b2==0)
		{
			b1=0;
			t3=t1+t2;
		}
		else if(b1==0 && b2==0)
		{
			if(t3<=t1)
			{
				b2=1;
			}
		}
		else
		{
			t3=0;
			b1=1;
			b2=0;
		}
	}
	
};

class Logic1_0
{
	int pin;
	int b;
	int x;
	
	public:
	Logic1_0(int _pin, int _b)
	{
		pin=_pin;
		pinMode(pin, OUTPUT);
		x=LOW;
		b=_b;
	}
	int status=b;
	
	void read()
	{
		x=digitalRead(pin);
		
		if(x==HIGH)
		{
			b=1;
		}
		else
		{
			b=0;
		}
		if(b=1)
		{
		digitalWrite(pin, HIGH);
		}
		else if(b=0)
		{
		digitalWrite(pin, LOW);
		}
	}
};

volt acc(A1, 4.191, 10.5);
volt bat(A0, 4.191, 10);
volt oil(A7, 4.191, 10);
volt lamp_R(A6, 4.191, 10);
volt lamp_S(A5, 4.191, 10);
timer head(0, 0, 900000);
timer cam_pin(0, 0, 15000);
Logic1_0 ard(2, 0);
Logic1_0 audio(3, 0);
Logic1_0 andr(4, 0);
Logic1_0 rem(13, 0);

void setup()
{
	int status[6]={acc.flag, bat.flag, head.flag_zum, audio.status, andr.status, rem.status};
	int cam[3]={lamp_R.flag, lamp_S.flag, cam_pin.flag_zum};
}

void loop()
{
	acc.read_v();
	bat.read_v();
	oil.read_v();
	lamp_R.read_v();
	lamp_S.read_v();
	head.zummer();
	audio.read();
	andr.read();
	rem.read();
}

Код ещё сырой, может и вовсе ересть несу...

 

Sic20101
Offline
Зарегистрирован: 30.06.2015

Вообщем, суть смотрим рабочее напряжение сети, есть 1  нет 0 и включаем таймер. Таймер сработал И напряжение ниже рабочего все отключаем, выровнялось продолжаем работу и так далее. Там выходит 5 возможных вариантов событий.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Sic20101 пишет:

Вообщем, суть смотрим рабочее напряжение сети, есть 1  нет 0 и включаем таймер. Таймер сработал И напряжение ниже рабочего все отключаем, выровнялось продолжаем работу и так далее. Там выходит 5 возможных вариантов событий.

Похоже вы начали подражать меня.Но тогда надо делать классы Do. В конструктор вставлять указатель на функцию void Do(){} . вот с помощью ее и ключайте таймер или флаги,какие вам надо.

Sic20101
Offline
Зарегистрирован: 30.06.2015

Нет. Подражанием и не пахнет. Все из своей тёмной головушки))) 

и мне не надо рулить флагами, я хочу чтобы флаги рулили дальнейшем ходом событий. Тоесть все вычисляеться и заполняет массив, а от его вида уже происходило дальнейшее действие по сценарию...  это блок питания в машину который питает Андройд девплату усилок монитор и двумя камерами. Сел ключ вставил, задержка времени или проверка запуска авто, запуск системы, остановился отошёл куда нибудь система отключает усилок камеры и уходит в сон с контролем напряжения борт сети и таймером отключения минут на 20, если ушёл на долго. Ну и если напряжение в это время падает ниже порогового задержка на 5 секунд и аварийное отключение. Чтобы не высадить АКБ.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Тогда еще хуже. Если вы перечитаете "Старый завет", то в нем вы не найдете "рулящих флагов". Ну нет такой конструкции в Си. Рулить может только функция получившая управление. В общем попытайтесь все же изучить эту программу Пакет ее здесь https://yadi.sk/d/jwV-7Ejz3GmADU

Ну и головной файл выложу.

/* class_Led_A.ino 
  #1 светодиод ->13
  #2 кнопка 1 -> 4 вкл светодиод
  #3 кнопка 2 -> 5 выкл светодиод
  #4 кнопка 3 -> 6 светодиод мигает
*/
// шина выхода
#include "Cl_digitalOut.h"
Cl_digitalOut Out(13); //-0 светодиод 
// шина входа
#include "Cl_digitalIn.h"
Cl_digitalIn In[] = {
  Cl_digitalIn(4), // 0- кнопка 1  вкл светодиод
  Cl_digitalIn(5), // 1- кнопка 2  выкл светодиод
  Cl_digitalIn(6)  // 2- кнопка 3 светодиод мигает
};
// #1 светодиод
#include "Cl_led.h"
Cl_led *Led1 = new Cl_led(&Out, 1); // подключить светодиод
// #2 кнопка
void Do_Btn1() {
  Led1->ON(); // включить светодиод
}
void Do_Btn2() {
  Led1->OFF();// выключить светодиод
}
void Do_Btn3() {
  Led1->blink(500); // мигать 0.5 горит -0.5 нет
}
#include "Cl_do_btn.h"
Cl_do_btn * Btn[] =  {
  new Cl_do_btn(&In[0], 0,    // шина, уровень при наж кнопки
  & Do_Btn1   ),              // какую функцию надо сделать
  new Cl_do_btn(&In[1], 0,    // шина, уровень при наж кнопки
  & Do_Btn2   ),              // какую функцию надо сделать
  new Cl_do_btn(&In[2], 0,    // шина, уровень при наж кнопки
  & Do_Btn3   )               // какую функцию надо сделать
};
void setup() {
  Led1->setup();
  for (byte i = 0; i < 3; i++)Btn[i]->setup();
}

void loop() {
  Led1->loop();
  for (byte i = 0; i < 3; i++)Btn[i]->loop();
}

 

Sic20101
Offline
Зарегистрирован: 30.06.2015

За ссылку спасибо. Изучу, переварю, осмыслю))))

По поводу функция рулит, тоже в курсе. Вот как раз в этом и загвоздка как функции передать весь массив целиком?

Что бы это выглядело так например:

If(весь массив равен == 01000)

{//проверяем реальное напряжение;

 //взводим таймер;

}

If(весь массив равен ==11000)

{//отключаем таймер;

//запускаем Андройд, усилитель, сигнал rem;

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Sic20101, если Вам достаточно 32 флагов, используйте не массив, а число нужной разрядности, выделяя в нем флаги битовыми операциями.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Блин . Чекнулись с этими флагами. ТС пошел как "настоящий херой и сусанинец" В данной ситуации это уже не флаги а события. Процедуры которые выявляют каким стал "флаг"(какое наступило событие) называются генераторами событий. А вот уже события обрабатывают отработчик события. И да обработчик одногособытия может вызывать генератор серии следующих. И не надо из событий делать всякие массивы. Ну разве что если у вас эти события одного класса.

//
bool Event_generator1() {}   // генератор события 1
void Event_handler1() {}     // обработчик события 1

bool Event_generator2() {}   // генератор события 2
void Event_handler2() {}     // обработчик события 2

bool Event_generator3() {}   // генератор события 3
void Event_handler3() {}     // обработчик события 3

void setup() {
}

void loop() {
  if (Event_generator1())Event_handler1();
  if (Event_generator2())Event_handler2();
  if (Event_generator3())Event_handler3();
}

 ПС: И в заключении, насуете делаев или другой хрени, то у вас нормальной работы не будет.