чтение с ком-порта при использовании прерывания
- Войдите на сайт для отправки комментариев
Чт, 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);
согласен, накосячил )) по проблеме можете на мысль натолкнуть?
согласен, накосячил )) по проблеме можете на мысль натолкнуть?
так это и есть по проблеме. У вас эта и другие задержки в прерывании занимают все время микроконтроллера, на работу с датчиком времени не остается. Надо переписывать код диммера в неблокируюшем виде, ваш код ничего кроме диммирования успевать не будет.