Сделал стенд который должен демострировать возможности платы Ардуино уно. А именно возможность выполнения нескольких независимых задач. Первая функция включения \ выключения лампы накаливания реализована с помощью двух режимов работы, которые переключаются кнопкой на макете. Первый режим, - когда кнопка отключена – лампа включается при недостаточной освещенности с помощью фоторезистора (чувствительность регулируется программно). В дальнейшем регулировку чувствительности фоторезистора можно подключить через переменный резистор, что облегчит задачу. Второй режим включается, когда кнопка включена, в этом режиме фоторезистор отключается и в действие вступает инфракрасный приемник который реагирует на кнопки «+» и «-» соответственно включая и выключая лампу накаливания. Прежде чем вставить коды кнопок «+» и «-» в код программы они были считаны предварительно с пульта дистанционного управления с помощью монитора последовательного порта.
Вторая функция, - вывод на жидкокристаллический двухстрочный дисплей показания влажности и температуры воздуха с датчика 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()
не пойму как её связать с моими действиями.
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
Вы понимаете. что else в строке 67 относится к if в строке 52, а не к if в строке 50. Так и было задумано? Мне непонятна эта логика.
По поводу задержки, ну так отработайте задержку без delay. Как это делается написано в примере на сайте.
Сделал стенд который должен демострировать возможности платы Ардуино уно. А именно возможность выполнения нескольких независимых задач. Первая функция ..
Вторая функция..