чтение с ком-порта при использовании прерывания

postcrypt
Offline
Зарегистрирован: 31.05.2018
#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 секунды, между выводами показаний

  
 
}

Столкнулся с проблемой: как только добавляю прерывание - ничего не могу прочитать с ком-порта. В целом задача стоит такая: регулируя мощность лампочки поддерживать температуру внутри инкубатора ориентируясь на показания датчика температуры с ком-порта. Прошу помощи, ребята, Спасибо!

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

postcrypt пишет:
Столкнулся с проблемой: как только добавляю прерывание - ничего не могу прочитать с ком-порта. Прошу помощи, ребята, Спасибо!
Вы это серьезно, или перед нами дурака включили. 

Если дурака включили, то и мне не зазорно.  Вот когда я говорю словами , то люди меня слышат. Но когда блин перехожу на телепатию, то эти с9**и(нехорошие люди) делают вид что не слышат, хотя слышат меня хорошо. Я голосом проверял.

postcrypt
Offline
Зарегистрирован: 31.05.2018

qwone пишет:

Вы это серьезно, или перед нами дурака включили. 

Если дурака включили, то и мне не зазорно.  Вот когда я говорю словами , то люди меня слышат. Но когда блин перехожу на телепатию, то эти с9**и(нехорошие люди) делают вид что не слышат, хотя слышат меня хорошо. Я голосом проверял.

я не программирую контроллеры, с ардуино столкнулся впервый раз. "С наскока" сделать не получилось.

Есть диммер 220V, он работает на прерывании, есть датчик температуры. как только в скетч добавляю attachInterrupt - дачик температуры с ком-порта отваливатся- в loop данные sensor.read() не приходят. 

в документации к AttachInterrupt есть замечание: возможна потеря данных передаваемых по последовательному соединению (Serial data) в момет выполнения функции прерывания. Как можно решить эту проблему?

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

postcrypt, так вот запомните на будущее . В обработчиках прерывания никаких  delay(2000);

postcrypt
Offline
Зарегистрирован: 31.05.2018

qwone пишет:

В обработчиках прерывания никаких  delay(2000);

согласен, накосячил )) по проблеме можете на мысль натолкнуть?

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

postcrypt пишет:
согласен, накосячил )) по проблеме можете на мысль натолкнуть?
Видите, так получилось, что в телепатии я не силен. Дара ясновидинья я за собой не замечал.

b707
Offline
Зарегистрирован: 26.05.2017

postcrypt пишет:

согласен, накосячил )) по проблеме можете на мысль натолкнуть?

так это и есть по проблеме. У вас эта и другие задержки в прерывании занимают все время микроконтроллера, на работу с датчиком времени не остается. Надо переписывать код диммера в неблокируюшем виде, ваш код ничего кроме диммирования успевать не будет.