Нужна помощь в отладке кода для демонстрационного стенда

sobakabkmz
Offline
Зарегистрирован: 18.04.2017

Сделал стенд который должен демострировать возможности платы Ардуино уно. А именно возможность выполнения нескольких независимых задач. Первая функция включения \ выключения лампы накаливания реализована с помощью двух режимов работы, которые переключаются кнопкой на макете. Первый режим, - когда кнопка отключена – лампа включается при недостаточной освещенности с помощью фоторезистора (чувствительность регулируется программно). В дальнейшем регулировку чувствительности фоторезистора можно подключить через переменный резистор, что облегчит задачу. Второй режим включается, когда кнопка включена, в этом режиме фоторезистор отключается и в действие вступает инфракрасный приемник который реагирует на кнопки «+» и «-» соответственно включая и выключая лампу накаливания. Прежде чем вставить коды кнопок «+» и «-» в код программы они были считаны предварительно с пульта дистанционного управления с помощью монитора последовательного порта.

Вторая функция, - вывод на жидкокристаллический двухстрочный дисплей показания влажности и температуры воздуха с датчика DHT11. Данные с датчика преобразованы в проценты и градусы Цельсия непосредственно в коде программы. В стандартной библиотеке LCD – дисплея не предусмотрены буквы русского алфавита, поэтому для названий показаний был использован латинский алфавит. Так же в этой библиотеке не оказалось символа градуса. Поэтому его пришлось закодировать в скетче.

Третья функция предусматривает открывание и закрывание обычного дверного или оконного шпингалета соединенного с сервоприводом. Данная функция осуществлена c помощью модуля считывания RFID – меток MFRC522. Данный модуль позволяет считывать специальные номера из RFID-карт и ключей. Таким образом из монитора последовательного порта был скопирован номер карты и вставлен в скетч, тем самым программно предусматривая открывание шпингалета на некоторое время. После этого механизм закрывает шпингалет. 

скетч выглядит следующим образом

#include "IRremote.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <iarduino_DHT.h>   // подключаем библиотеку для работы с датчиком DHT
IRrecv irrecv(8); // Указываем пин, к которому подключен приемник
decode_results results;
int relay = 4;
int sensor = 0; 
int tumbler = 1;
LiquidCrystal_I2C lcd(0x27, 16, 2);
iarduino_DHT sens(2);
 
byte degree[8] = // кодируем символ градуса
{
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
};
#include <Servo.h>
#include <SPI.h>
#include <MFRC522.h> // библиотека "RFID".
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
unsigned long uidDec, uidDecTemp;  // для храниения номера метки в десятичном формате
Servo servo;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); // Выставляем скорость COM порта
  irrecv.enableIRIn(); // Запускаем прием
pinMode(relay, OUTPUT); 
pinMode(tumbler, INPUT);
analogReference(DEFAULT);     
  lcd.init();
  lcd.backlight();
  lcd.createChar(1, degree);
  Serial.println("Waiting for card...");
  SPI.begin();  //  инициализация SPI / Init SPI bus.
  mfrc522.PCD_Init();     // инициализация MFRC522 / Init MFRC522 card.
  servo.attach(6);
  servo.write(0);  // устанавливаем серву в закрытое сосотояние
}
void loop(){
  
  
  if (analogRead(tumbler) > 800)
  Serial.println(analogRead (tumbler));
  if (irrecv.decode(&results))
  {
   int res = results.value;
  Serial.println(results.value, HEX);
  if(res==0xFFFFA857)
  {
   digitalWrite(relay, HIGH);
   }
    else if(res==0xFFFFE01F) 
    {
      digitalWrite(relay, LOW);
      }
  irrecv.resume();
  
    }
else if (analogRead(tumbler) < 800){
  Serial.println(analogRead (sensor));
int val = analogRead(sensor);
if(val < 750) digitalWrite(relay, HIGH);
else digitalWrite(relay, LOW);
    }
  int chk = sens.read();
  lcd.setCursor(0, 0);
  lcd.print("Wlajn:");
  lcd.setCursor(8, 0);
  lcd.print(sens.hum);
  lcd.setCursor(14, 0);
  lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print("Temper:");
  lcd.setCursor(8, 1);
  lcd.print(sens.tem);
  lcd.setCursor(14, 1);
  lcd.print("\1C");  
 
    // Поиск новой метки
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }
  // Выбор метки
  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("Card UID: ");
  Serial.println(uidDec); // Выводим UID метки в консоль.
  if (uidDec == 1529300949) // Сравниваем Uid метки, если он равен заданому то серва открывает.
  {
    tone(5, 200, 500); // Делаем звуковой сигнал, Открытие
    servo.write(90); // Поворациваем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворациваем ключ и т.д.)
    delay(3000); // пауза 3 сек и механизм запирается.
    tone(5, 500, 500); // Делаем звуковой сигнал,  Закрытие
  }
  servo.write(0);  // устанавливаем серву в закрытое сосотояние
}
 
 
не получается добилься независимости этих функций. если убираю задержку в 3 секунды плата виснет. 
помогите разобраться в какую сторону мне копать. если использовать millis()
не пойму как её связать с моими действиями.
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
sobakabkmz
Offline
Зарегистрирован: 18.04.2017
#include "IRremote.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <iarduino_DHT.h>   // подключаем библиотеку для работы с датчиком DHT
IRrecv irrecv(8); // Указываем пин, к которому подключен приемник
decode_results results;
int relay = 4;
int sensor = 0; 
int tumbler = 1;
LiquidCrystal_I2C lcd(0x27, 16, 2);
iarduino_DHT sens(2);

byte degree[8] = // кодируем символ градуса
{
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
};
#include <Servo.h>
#include <SPI.h>
#include <MFRC522.h> // библиотека "RFID".
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
unsigned long uidDec, uidDecTemp;  // для храниения номера метки в десятичном формате
Servo servo;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600); // Выставляем скорость COM порта
  irrecv.enableIRIn(); // Запускаем прием
pinMode(relay, OUTPUT); 
pinMode(tumbler, INPUT);
analogReference(DEFAULT);     
  lcd.init();
  lcd.backlight();
  lcd.createChar(1, degree);
  Serial.println("Waiting for card...");
  SPI.begin();  //  инициализация SPI / Init SPI bus.
  mfrc522.PCD_Init();     // инициализация MFRC522 / Init MFRC522 card.
  servo.attach(6);
  servo.write(0);  // устанавливаем серву в закрытое сосотояние
}
void loop(){
  
  
  if (analogRead(tumbler) > 800)
  Serial.println(analogRead (tumbler));
  if (irrecv.decode(&results))
  {
   int res = results.value;
  Serial.println(results.value, HEX);
  if(res==0xFFFFA857)
  {
   digitalWrite(relay, HIGH);
   }
    else if(res==0xFFFFE01F) 
    {
      digitalWrite(relay, LOW);
      }
  irrecv.resume();
  
    }
else if (analogRead(tumbler) < 800){
  Serial.println(analogRead (sensor));
int val = analogRead(sensor);
if(val < 750) digitalWrite(relay, HIGH);
else digitalWrite(relay, LOW);
    }
  int chk = sens.read();
  lcd.setCursor(0, 0);
  lcd.print("Wlajn:");
  lcd.setCursor(8, 0);
  lcd.print(sens.hum);
  lcd.setCursor(14, 0);
  lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print("Temper:");
  lcd.setCursor(8, 1);
  lcd.print(sens.tem);
  lcd.setCursor(14, 1);
  lcd.print("\1C");  

    // Поиск новой метки
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }
  // Выбор метки
  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("Card UID: ");
  Serial.println(uidDec); // Выводим UID метки в консоль.
  if (uidDec == 1529300949) // Сравниваем Uid метки, если он равен заданому то серва открывает.
  {
    tone(5, 200, 500); // Делаем звуковой сигнал, Открытие
    servo.write(90); // Поворациваем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворациваем ключ и т.д.)
    delay(3000); // пауза 3 сек и механизм запирается.
    tone(5, 500, 500); // Делаем звуковой сигнал,  Закрытие
  }
  servo.write(0);  // устанавливаем серву в закрытое сосотояние
}

 

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

Вы понимаете. что else в строке 67 относится к if в строке 52, а не к if в строке 50. Так и было задумано? Мне непонятна эта логика.

По поводу задержки, ну так отработайте задержку без delay. Как это делается написано в примере на сайте.

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

sobakabkmz пишет:

Сделал стенд который должен демострировать возможности платы Ардуино уно. А именно возможность выполнения нескольких независимых задач. Первая функция ..

Вторая функция..

 Похоже очередной "волшебник-недоучка" Сделать хотел грозу, А получил козу, Розовую козу С жёлтою полосой . Стенд это конечно хорошо. Но ведь вы не только должны показать железо и работу , но и скетч. Где у вас выделена 1 функция, 2 функция, 3 функция. Где возможность любую из них закоментировать и показать работу стенда без нее. То что ардуина может делать не одну задачу а несколько я знаю. А вот народ банально не умеет это выразить в структуре программы. Ведь , я повторяю, вы будете демонстрировать еще и скетч.