чтение с ком-порта при использовании прерывания
- Войдите на сайт для отправки комментариев
Чт, 31/05/2018 - 00:18
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <iarduino_DHT.h> // Подключаем библиотеку для работы с датчиком DHT
iarduino_DHT sensor(5); // Объявляем объект, указывая номер вывода, к которому подключён модуль
LiquidCrystal_I2C lcd(0x38,16,2); // Устанавливаем дисплей
int AC_LOAD = 4; // Output to Opto Triac pin
int dimming = 128; // Dimming level (0-128) 0 = ON, 128 = OFF
void setup()
{
Serial.begin(115200); // Инициируем передачу данных в монитор последовательного порта, на скорости 9600 бод
delay(1000); // Приостанавливаем выполнение скетча на 1 секунду, для перехода датчика в активное состояние
lcd.init();
lcd.backlight();// Включаем подсветку дисплея
lcd.print("hum.");
lcd.setCursor(11, 0);
lcd.print("temp.");
pinMode(AC_LOAD, OUTPUT);// Set AC Load pin as output
attachInterrupt(0, zero_crosss_int, RISING); // Choose the zero cross interrupt # from the table above
}
//the interrupt function must take no parameters and return nothing
void zero_crosss_int() //function to be fired at the zero crossing to dim the light
{
// Firing angle calculation : 1 full 50Hz wave =1/50=20ms
// Every zerocrossing thus: (50Hz)-> 10ms (1/2 Cycle)
// For 60Hz => 8.33ms (10.000/120)
// 10ms=10000us
// (10000us - 10us) / 128 = 75 (Approx) For 60Hz =>65
int dimtime = (75*dimming); // For 60Hz =>65
delayMicroseconds(dimtime); // Wait till firing the TRIAC
digitalWrite(AC_LOAD, HIGH); // Fire the TRIAC
delayMicroseconds(10); // triac On propogation delay (for 60Hz use 8.33)
digitalWrite(AC_LOAD, LOW); // No longer trigger the TRIAC (the next zero crossing will swith it off) TRIAC
delay(2000);
}
void loop()
{
for (int i=5; i <= 128; i++){
dimming=i;
delay(10);
}
switch(sensor.read()){ // Читаем показания датчика
case DHT_OK:
Serial.println((String) sensor.hum + "% - " + sensor.tem + "*C");
// Устанавливаем курсор на вторую строку и нулевой символ.
lcd.setCursor(0, 1);
lcd.print(sensor.hum);
lcd.setCursor(11, 1);
lcd.print(sensor.tem);
break;
case DHT_ERROR_CHECKSUM: Serial.println("HE PABEHCTBO KC"); break;
case DHT_ERROR_DATA: Serial.println("OTBET HE COOTBETCTB. CEHCOPAM 'DHT'"); break;
case DHT_ERROR_NO_REPLY: Serial.println("HET OTBETA"); break;
default: Serial.println("ERROR"); break;
} delay(2000); // Приостанавливаем выполнение скетча на 2 секунды, между выводами показаний
}
Столкнулся с проблемой: как только добавляю прерывание - ничего не могу прочитать с ком-порта. В целом задача стоит такая: регулируя мощность лампочки поддерживать температуру внутри инкубатора ориентируясь на показания датчика температуры с ком-порта. Прошу помощи, ребята, Спасибо!
Если дурака включили, то и мне не зазорно. Вот когда я говорю словами , то люди меня слышат. Но когда блин перехожу на телепатию, то эти с9**и(нехорошие люди) делают вид что не слышат, хотя слышат меня хорошо. Я голосом проверял.
Вы это серьезно, или перед нами дурака включили.
Если дурака включили, то и мне не зазорно. Вот когда я говорю словами , то люди меня слышат. Но когда блин перехожу на телепатию, то эти с9**и(нехорошие люди) делают вид что не слышат, хотя слышат меня хорошо. Я голосом проверял.
я не программирую контроллеры, с ардуино столкнулся впервый раз. "С наскока" сделать не получилось.
Есть диммер 220V, он работает на прерывании, есть датчик температуры. как только в скетч добавляю attachInterrupt - дачик температуры с ком-порта отваливатся- в loop данные sensor.read() не приходят.
в документации к AttachInterrupt есть замечание: возможна потеря данных передаваемых по последовательному соединению (Serial data) в момет выполнения функции прерывания. Как можно решить эту проблему?
postcrypt, так вот запомните на будущее . В обработчиках прерывания никаких
delay(2000);В обработчиках прерывания никаких
delay(2000);согласен, накосячил )) по проблеме можете на мысль натолкнуть?
согласен, накосячил )) по проблеме можете на мысль натолкнуть?
так это и есть по проблеме. У вас эта и другие задержки в прерывании занимают все время микроконтроллера, на работу с датчиком времени не остается. Надо переписывать код диммера в неблокируюшем виде, ваш код ничего кроме диммирования успевать не будет.