переменная для выполнения действия или переход к метке
- Войдите на сайт для отправки комментариев
Ср, 26/10/2016 - 19:56
имеется код
И как сделать переход к метке, раньше делал через 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);
И ЧЕТВЕРТОЙ
}
}
и как сделать эту метку?
имеется код
И как сделать переход к метке, раньше делал через goto, но тут несколько void и я думаю что можно сделать через переменную.
Как реализовать?
Поиск выдает void в четырех местах.
Меток незаметил.
Вы злоупотребляете чтото?
Не нужны метки. Помещаешь нужные куски кода в функции и вызываешь эти функции в любом месте программы, где это нужно.
я же спросил как сделать эту метку, их тут поэтому и нету.
хорошо поставлю по другому
при выполнении действия переменная становится истинной
в другой части кода проверяестся условие
если переменная истина, то выполняется действие.
вы спросите зачем? много rfid меток+ пульт
писать под каждое действие нерационально.
вот и как это написать в коде?
болеан?
инт?
вот это то что я имел в виду,
Спасибо, очень помог
значит пишу чтото подобное
for(I=1;) код
а как сделать чтобы I =1 при выполнении действия и возвращать обратно.
Что-то у вас громозко получилось.
/* //#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); } } } }у меня еще пульт 433 мгц
И что? Там похожая конструкция как и кнопка
У меня серва это замок. Закрывает если дверь закрыта и истекло время. Кнопка возле двери, удаленая кнопка. Два ключа метки. В принципе можно одной , но куча дубликатов. А радио это просто обычная кнопка по программе. Только физически вместо контакта радио. И даже никаких дисплеев не надо.
значит пишу чтото подобное
for(I=1;) код
а как сделать чтобы I =1 при выполнении действия и возвращать обратно.
мрак... шуруй Си учить..
Viktor_Samsonov, не используй говнокод от qwone. В его коде баги, этот олень целочисленную арифметику не понимает.
О анитифанат появился. Выпил яд? Что еще не подействовал.
Viktor_Samsonov,
знаете, Logic Вам посоветовал С подучить, присоединюсь.
Я честно пытался понять что Вам нужно и помочь (реально чемтно пытался), внимаетльно читал то, что Вы написали, но не смог поянть. Вы неправильно используете слова (видимо, не зная, что они означают) и текст получается просто бредом.
Я действительно хочу Вам помочь, попробуйте объяснить что Вам нужно простыми словами в понимании которых Вы уверены (без void и пр). например в коде поставьте или ещё как, но пока я понять Вас не сумел.
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);
}
как то так нужно?
действительльно это то что я искал, спасибо,Jeka_M