переменная для выполнения действия или переход к метке

Viktor_Samsonov
Offline
Зарегистрирован: 16.09.2016

имеется код

И как сделать переход к метке, раньше делал через goto, но тут несколько void и я думаю что можно сделать через переменную.

Как реализовать?




#include <RemoteReceiver.h>
///////////////////////////////////////////////////////////////////////////////////////

#include <MFRC522.h> // это скачанная библиотека "RFID".
///////////////////////////////////////////////////////////////////////

int button = 14; 







///////////////////////////////////////////////////////////////////////////
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);  // объект MFRC522C / reate MFRC522 instance.
unsigned long uidDec, uidDecTemp;  // для отображения номера карточки в десятичном формате
int pik = 8;
int kalitka = 7;
int pultC = 5;
int pultD = 6;
int vorota = 3;
int vorota2 =4;
///////////////////////////////////////////////////////////////////////////////////////j
void setup() {
  Serial.begin(9600);
    RemoteReceiver::init(0, 3, showCode);
////////////////////////////////////////////////////////////////////////////
  Serial.println("Prilozhite kartu / Waiting for card...");
  SPI.begin();  //  инициализация SPI / Init SPI bus.
  mfrc522.PCD_Init();     // инициализация MFRC522 / Init MFRC522 card.

pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
pinMode(4, OUTPUT);
pinMode(3, OUTPUT);

  digitalWrite(vorota , LOW);
  digitalWrite(vorota2, LOW);
///////////////////////////////////////////////////////////////////////////j
}

void loop() {


 // Поиск новой карточки / Look for new cards.
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Выбор карточки / Select one of the cards.
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  uidDec = 0;

  // Выдача серийного номера карточки.
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
    uidDecTemp = mfrc522.uid.uidByte[i];
    uidDec = uidDec*256+uidDecTemp;  
  }  
  Serial.println("Serijnyj nomer karty / Card UID: ");
  Serial.println(uidDec);

  // начинаем сравнивать номер прочитанной корты, с записанным номером карты.
  // замените! № "422455350", на номер № вашей карты.
  if (uidDec == 637564577)
  {digitalWrite(kalitka, HIGH); 
  ///////////////////////////////////////////////////////////////////////////////////////melody
  tone(pik, 1200, 677);
  delay(200);
  tone(pik, 1000, 677);
  delay(200);
      tone(pik, 1200, 677);
  delay(200);
  tone(pik, 1000, 677);
  delay(200);
  tone(pik, 1200, 677);
  delay(200);
  tone(pik, 1000, 677);
  delay(200);
      tone(pik, 1200, 677);
  delay(200);
  tone(pik, 1000, 677);
  delay(200);
  tone(pik, 1200, 677);
  delay(200);
  tone(pik, 1000, 677);
  delay(200);
      tone(pik, 1200, 677);
  delay(200);
  tone(pik, 1000, 677);
  delay(200);
   ///////////////////////////////////////////////////////////////////////////////////////melody
  digitalWrite(kalitka, LOW); 
    // если номер совпал включим светодиод.
    
    // и отправим сообщение.
    Serial.println("Hi ");
  }

  // также и с другими номерами карт.
  else if (uidDec == 959884118)
  {
    
    Serial.println("Hi ");
  }

  else if (uidDec == 695670870)
  {
    
    Serial.println("Hi ");
  }

  else if (uidDec == 695670614)
  {
   
    Serial.println("Hi ");
  }

  else 
  {
    // если номер карты не совпал
 
    Serial.println("Neizvestnaja karta / unknown card");
  }

  Serial.println("=====================================");

  


}

void showCode(unsigned long receivedCode, unsigned int period) {
  //Note: interrupts are disabled. You can re-enable them if needed.
  
  //Print the received code.
  Serial.print("Code: ");
  Serial.print(receivedCode);
  Serial.print(", period duration: ");
  Serial.print(period);
  Serial.println("us.");
  if (receivedCode == 315198)
  {
и перейти к первой метке 
    tone(pik, 1000, 677);}

else if (receivedCode == 315180)
  {tone(pik, 600, 677)
ВТОРОЙ
;
  }

  else if (receivedCode == 315174)
  {  Вот по этому действию надо перейти к метке мелодия
 }

  else if (receivedCode == 315172)
  {tone(pik, 200, 677);
И ЧЕТВЕРТОЙ
 }


}

 

 

Viktor_Samsonov
Offline
Зарегистрирован: 16.09.2016

и как сделать эту метку?

Logik
Offline
Зарегистрирован: 05.08.2014

Viktor_Samsonov пишет:

имеется код

И как сделать переход к метке, раньше делал через goto, но тут несколько void и я думаю что можно сделать через переменную.

Как реализовать?

Поиск выдает void в четырех местах.

1. но тут несколько void и...
2. void setup() {
3. void loop() {
4. void showCode(

Меток незаметил.

 Вы злоупотребляете чтото?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Не нужны метки. Помещаешь нужные куски кода в функции и вызываешь эти функции в любом месте программы, где это нужно.

Viktor_Samsonov
Offline
Зарегистрирован: 16.09.2016

я же спросил как сделать эту метку, их тут поэтому и нету.

хорошо поставлю по другому 

при выполнении действия переменная становится истинной 

в другой части кода проверяестся условие

если переменная истина, то выполняется действие.

вы спросите зачем? много rfid меток+ пульт

писать под каждое действие нерационально.

вот и как это написать в коде?

болеан?

инт?

Viktor_Samsonov
Offline
Зарегистрирован: 16.09.2016

вот это то что я имел в виду,

Спасибо, очень помог 

Viktor_Samsonov
Offline
Зарегистрирован: 16.09.2016

значит пишу чтото подобное

for(I=1;) код

а как сделать чтобы I =1 при выполнении действия и возвращать обратно.

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

Что-то у вас громозко получилось. 

/*
//#1
светодиод -> 8 (Led_pin) 0 горит/ 1 нет
       GND ->  GND
серва  -> 5 (servo_pin)
геркон -> A3 (gercon_pin) 0 дверь закрыта / 1 нет
//#2
кнопка1 -> A1 (btm1_pin) 0 нажата/ 1 нет
       GND ->  GND
кнопка2 -> A2 (btm2_pin) 0 нажата/ 1 нет
       GND ->  GND
//#3               Arduino Uno
RFID_RC522 RST -> 9 (RST_pin)
        SDA(SS)-> 10 (SDA_pin)
        MOSI   -> 11 (MOSI_pin)
        MISO   -> 12 (MISO_pin)
        SCK    -> 13 (SCK_pin)
        3,3В   -> 3,3В
        GND    -> GND

        Card UID: E6 38 FE 13  брелок
        Card UID: 5A 5D 39 D5  пластик
*/
//#1
const int Led_pin = 8 ; // нога светодиода
uint8_t Led ;
const int interval = 2000 ; // интервал после нажатия клавиши 2 сек

#include <Servo.h>
Servo myservo;
const int servo_pin = 5  ; // нога серво
const int servo_OFF = 0; // серва закрыта
const int servo_ON = 90; // серва открыта
const int gercon_pin = A3  ; // нога геркона
uint8_t gercon ;
//#2
const int btm1_pin = A1  ; // нога кнопки
const int btm2_pin = A2  ; // нога кнопки
//#3
byte uidCard1[4] = {0xE6, 0x38, 0xFE, 0x13};
byte uidCard2[4] = {0x5A, 0x5D, 0x39, 0xD5};
#include <SPI.h>
#include <MFRC522.h>
const int SDA_pin = 10;
const int RST_pin = 9;

MFRC522 rfid(SDA_pin, RST_pin); // Instance of the class

void setup() {
  //#1
  pinMode(Led_pin, OUTPUT);
  digitalWrite(Led_pin, Led = 0);
  myservo.attach(servo_pin);
  pinMode(gercon_pin, INPUT_PULLUP);
  //#2
  pinMode(btm1_pin, INPUT_PULLUP);
  pinMode(btm2_pin, INPUT_PULLUP);
  //#3
  SPI.begin(); // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1
  static uint32_t future1 = 0 ;
  gercon = digitalRead(gercon_pin); // опрос состояния двери
  if (!gercon && !Led && (MILLIS >= future1)) { // убеждаемся что дверь закрыта и подошло время закрывать на замок
    digitalWrite(Led_pin, Led = 1);
    myservo.write(servo_OFF);  // закрываем
  }
  //#2
  if (!digitalRead(btm1_pin)) { // первая открывающая кнопка
    digitalWrite(Led_pin, Led = 0);
    future1 = millis() + interval;
    myservo.write(servo_ON);
  }
  if (!digitalRead(btm2_pin)) { // вторая открывающая кнопка
    digitalWrite(Led_pin, Led = 0);
    future1 = millis() + interval;
    myservo.write(servo_ON);
  }
  //#3
  static uint32_t future3 = 0 ;
  if (MILLIS >= future3)   {
    future3 = MILLIS + 1000 ;
    if ( rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
      if (rfid.uid.uidByte[0] == uidCard1[0] ||
          rfid.uid.uidByte[1] == uidCard1[1] ||
          rfid.uid.uidByte[2] == uidCard1[2] ||
          rfid.uid.uidByte[3] == uidCard1[3] ) {
        digitalWrite(Led_pin, Led = 0);
        future1 = millis() + interval;
        myservo.write(servo_ON);
      }
      if (rfid.uid.uidByte[0] == uidCard2[0] ||
          rfid.uid.uidByte[1] == uidCard2[1] ||
          rfid.uid.uidByte[2] == uidCard2[2] ||
          rfid.uid.uidByte[3] == uidCard2[3] ) {
        digitalWrite(Led_pin, Led = 0);
        future1 = millis() + interval;
        myservo.write(servo_ON);
      }
    }
  }
}

 

Viktor_Samsonov
Offline
Зарегистрирован: 16.09.2016

у меня еще пульт 433 мгц 

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

И что? Там похожая конструкция как и кнопка

У меня серва это замок. Закрывает если дверь закрыта и истекло время. Кнопка возле двери, удаленая кнопка. Два ключа метки. В принципе можно одной , но куча дубликатов. А радио это просто обычная кнопка по программе. Только физически вместо контакта радио. И даже никаких дисплеев не надо.

Logik
Offline
Зарегистрирован: 05.08.2014

Viktor_Samsonov пишет:

значит пишу чтото подобное

for(I=1;) код

а как сделать чтобы I =1 при выполнении действия и возвращать обратно.

мрак... шуруй Си учить..

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Viktor_Samsonov, не используй говнокод от qwone. В его коде баги, этот олень целочисленную арифметику не понимает.

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

О анитифанат появился. Выпил яд? Что еще не подействовал.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Viktor_Samsonov,

знаете, Logic Вам посоветовал С подучить, присоединюсь.

Я честно пытался понять что Вам нужно и помочь (реально чемтно пытался), внимаетльно читал то, что Вы написали, но не смог поянть. Вы неправильно используете слова (видимо, не зная, что они означают) и текст получается просто бредом.

Я действительно хочу Вам помочь, попробуйте объяснить что Вам нужно простыми словами в понимании которых Вы уверены (без void и пр). например в коде поставьте или ещё как, но пока я понять Вас не сумел.

Viktor_Samsonov
Offline
Зарегистрирован: 16.09.2016

     

2. ФУНКЦИИ

 

Функция - это именованная последовательность операций, которая находится вне других функций и может быть использована в любой другой функции. Функции позволяют разделить программу на несколько маленьких подпрограмм, которые в совокупности выполняют поставленную задачу. Также функции можно многократно использовать, что значительно сокращает размер кода программы.
Определение функции:

тип_возвращаемого_значения имя_функции (тип имя_переменной1, тип имя_переменной2)
{тело функции; }

Сама функция может принимать значение определенного типа. Этот тип указывается перед именем функции. Значение, которое принимает функция, пишется после слова return и называется возвращаемым значением. Если функция не имеет возвращаемого значения, а просто выполняет какую-либо последовательность операций, то перед именем функции указывается слово void.
Функция может иметь параметры. Это те значение, которые в ходе своего выполнения может использовать функция, и которые передаются в нее из главной функции (в нашем случае функции loop()). Параметры функции указываются в круглых скобках после имени функции. При определении функции параметры указываются с их типами. При вызове функции параметры могут указываться явно в виде значений или как переменные (без указания типа переменной), причем имена переменных при определении и вызове функции могут не совпадать.
Например: Есть два светодиода, которые подключены к 10 и 11 пинам. С использованием функции нужно поочередно зажигать светодиоды с интервалом 1000 миллисекунд.

 

void ledOn(int n) //создание функции с параметром n (номер светодиода)
{
if (n == 1)
{
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
}
else if (n == 2)
{
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
}
}

void setup()
{
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
}

void loop()
{
ledOn(1); //вызов функции с параметром 1 (зажжётся первый светодиод)
delay(1000);
ledOn(2); //вызов функции с параметром 2 (зажжётся второй светодиод)
delay(1000);
}

 

 

 

 

как то так нужно?

Viktor_Samsonov
Offline
Зарегистрирован: 16.09.2016

действительльно это то что я искал, спасибо,Jeka_M