#1 2018-02-06 11:23:57

Krolicman
Участник
Из Львів
Зарегистрирован: 2018-02-06
Сообщений: 5

Помогите пожалуйста с прериванием, студенту))

При нажатие кнопки должни менятса значение на екране (например: при 1 нажатие позанаие 1 датчика, при 2 нажатие показание 2 датчика температури, и т.д.) но проблема заключаетса в том что датчик DS18B20 обрабативаетса там примерно 0.7секунд, тоесть когда я нажимаю кнопку то ифнормация на екранах не меняетса. А когда я нажимаю на кнопку и держу примерно 2 секунди и потом отпускаю, то информация переключаетса. Подсказали что нужно сделать преривание но у меня не виходит, помогите кто в етом шарит)))

// ----БІБЛІОТЕКИ------ 

#include <OneWire.h>
#include <DallasTemperature.h>
#include "stDHT.h"
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

//-----ВХОДИ BMP280-----
#define BMP_SCK 13 //SCL
#define BMP_MISO 12 //SD0
#define BMP_MOSI 11 //SDA
#define BMP_CS 10 //CSB
//-----------------------


//------------------------------------------------------КНОПКА-----------------
 
#define Button 4
//int buttonInt = 0;

byte Mode = 1; 
bool Button_flag; 
//------------------------------------------------------------------------------


LiquidCrystal_I2C lcd(0x27,20,4);  // АДРЕСА ДИСПЛЕЯ, КІЛЬКІСТЬ СИМВОЛІВ ПО ГОРИЗОНТАЛІ І ВЕРТИКАЛІ
DHT sens(DHT11);
OneWire oneWire(9); // ВХІД DS18B20

DallasTemperature ds(&oneWire);
DeviceAddress sensor1 = {0x28, 0xFF, 0xD9, 0x2D, 0x01, 0x17, 0x04, 0x40}; // АДРЕСА 1 ДАТЧИКА ТЕМПЕРАТУРИ DS18B20
DeviceAddress sensor2 = {0x28, 0xFF, 0x52, 0x6B, 0x01, 0x17, 0x03, 0x91}; // АДРЕСА 2 ДАТЧИКА ТЕМПЕРАТУРИ DS18B20

Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO,  BMP_SCK);

 

void setup() {
  
  //----------------------------------------------------------------------------------------------------------
 // attachInterrupt(buttonInt, screenon, LOW);
  //---------------------------------------------------------------------------------------------------------
  
  Serial.begin(9600);
  ds.begin();
  
  //-----------------------------------------------------------------КНОПКА-------------------------- 
   pinMode(Button, INPUT_PULLUP); 
  //----------------------------------------------------------------------------------------------
  
  lcd.init();                     // ІНІЦІАЛІЗАЦІЯ LCD
  lcd.backlight();                // ВКЛЮЧЕННЯ ПІДСВІТКИ LCD
  
  pinMode(2, INPUT);              // вхід DHT11
  digitalWrite(2, HIGH);          
  
  //------ТЕСТ ДАТЧИКА BMP280------------------------------------------------------------
  Serial.println(F("BMP280 test"));
  if (!bmp.begin()) {  
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    while (1);
  }
 //---------------------------------------------------------------------------------------

}

void loop() {
  ds.requestTemperatures(); // зчитування температури
    
     int h = sens.readHumidity(2);    // зчитування вологості
   
     char tempC[]={'\1', 67, '\0'};   // КОДУЄМО СИМВОЛ " С "
  
  
   //-------------------------------ЗЧИТУЄМО ДАНІ------------------------------------------
    Serial.println("                                   ");
    Serial.println("                                   ");
    Serial.println("                                   ");
    
    Serial.print("Na dvori: ");
    Serial.print(ds.getTempC(sensor1)); // відправляємо температуру 1
    //Serial.println(tempC);
    Serial.println();
    
    Serial.print("V domi: ");
    Serial.print(ds.getTempC(sensor2)); // відправляємо температуру 2
   // Serial.println(tempC); 
    Serial.println(); 
 
    Serial.print("Vologist: "); // відправляємо вологість
    Serial.print(h);
    Serial.print(" %");
    Serial.println();
   Serial.println();

    Serial.print(F("Atmospheric pressure: ")); // відправляємо атмосферний тиск
     float press = 0.0075006375541921 * bmp.readPressure(); // ПЕРЕВОДИМО З ПАСКАЛЬ В ММ.РТ.СТ.
    Serial.print(press); 
    Serial.println(" mm.rt.st.");
    Serial.println();
    
    Serial.println("                                ");
    Serial.println("                                ");
 
  //--------------------------------------------------------------------------------------------
  
  //-------------------------------ВИВОДИМО ДАНІ НА ЕКРАН---------------------------------------
  /*
  lcd.setCursor(0,0);
  lcd.print("T1=");
  lcd.setCursor(3,0);
  lcd.print(ds.getTempC(sensor1));
  lcd.setCursor(8,0);
  lcd.print(tempC);
  
  lcd.setCursor(0,1);
  lcd.print("T2=");
  lcd.setCursor(3,1);
  lcd.print(ds.getTempC(sensor2));
  lcd.setCursor(8,1);
  lcd.print(tempC);
  
  lcd.setCursor(0,2);
  lcd.print("Vologist=");
  lcd.setCursor(9,2);
  lcd.print(h);
  lcd.setCursor(11,2);
  lcd.print("%");
  
  lcd.setCursor(0,3);
  lcd.print("AP=");
  lcd.setCursor(3,3);
  lcd.print(press);
  lcd.setCursor(9,3);
  lcd.print("mm.rt.st.");
  */
  //------------------------------------------------------------------------------------------------------
//}

//----------------------------------------------------------------------------------------------------------------------------------

 //---------------------------------------------------------------------------------------------КНОПКА--------------------------

if(digitalRead(Button) == 0){Button_flag = 1;}
if(digitalRead(Button) == 1 && Button_flag == 1){Button_flag = 0; lcd.clear(); Mode++;} 
if(Mode > 2){Mode = 1;} 
switch(Mode){ 

  case(1): 
lcd.setCursor(0,0);
  lcd.print("T1=");
  lcd.setCursor(3,0);
  lcd.print(ds.getTempC(sensor1));
  
  
break; 


case(2): 
lcd.setCursor(0,1);
  lcd.print("T2=");
  lcd.setCursor(3,1);
  lcd.print(ds.getTempC(sensor2));
  
  
break; 
/*
case(3): 
lcd.setCursor(0,2);
  lcd.print("Vologist=");
  lcd.setCursor(9,2);
  lcd.print(h);
  lcd.setCursor(11,2);
  lcd.print("%"); 
break; 

case(4): 
lcd.setCursor(0,3);
  lcd.print("AP=");
  lcd.setCursor(3,3);
  lcd.print(press);
  lcd.setCursor(9,3);
  lcd.print("mm.rt.st."); 
break; 
*/
  //***------------------------------------------------------------------------------------------------------------------------------------
  //delay(8000); 
}
}

#2 2018-02-06 12:22:10

vvr
Участник
Зарегистрирован: 2015-04-12
Сообщений: 507

Re: Помогите пожалуйста с прериванием, студенту))

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

#3 2018-02-06 12:23:34

Krolicman
Участник
Из Львів
Зарегистрирован: 2018-02-06
Сообщений: 5

Re: Помогите пожалуйста с прериванием, студенту))

vvr пишет:

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

Может ти подскажеш єсли сталкивалса с етим? или хоть силочку даш, а то я не отличу то что нужно от того что там будет smile

#4 2018-02-06 12:26:29

Krolicman
Участник
Из Львів
Зарегистрирован: 2018-02-06
Сообщений: 5

Re: Помогите пожалуйста с прериванием, студенту))

Вячеслав Азаров пишет:
Krolicman пишет:

При нажатие кнопки должни менятса значение на екране (например: при 1 нажатие позанаие 1 датчика, при 2 нажатие показание 2 датчика температури, и т.д.) но проблема заключаетса в том что датчик DS18B20 обрабативаетса там примерно 0.7секунд, тоесть когда я нажимаю кнопку то ифнормация на екранах не меняетса. А когда я нажимаю на кнопку и держу примерно 2 секунди и потом отпускаю, то информация переключаетса. Подсказали что нужно сделать преривание но у меня не виходит, помогите кто в етом шарит)))

Корректно выполнять эти функции, из существующих библиотек, асинхронно можно только с помощью монитора вытесняющей многозадачности. Или как сейчас это модно называть - RTOS.

Я верю что ти в етом шариш, но можно более конкретно для тупого человека а не для такого как ти?

#5 2018-02-06 12:48:23

goodspeedmen
Участник
Из https://discord.gg/6hbs98y
Зарегистрирован: 2016-10-02
Сообщений: 81

Re: Помогите пожалуйста с прериванием, студенту))

void setup()
{
void timer_COMPA_ON()
{
  TCNT1 = 0x00;    
  OCR1A = 0x1194;                          // 4500  при этом значении прерывание произойдет  примерно через  0.33 секунды. Канал А.
  OCR1B = ---------;                         // рассчитаешь значение интервала который тебе нужен. Канал B.
  TCCR1A = 0b00000000;
  TCCR1B = 0b00000101;
  TIMSK1 = 0b00000110;
}
}

//======================================================================
void loop()                                      // loop.
{

}

эти функции обработки прерываний должны быть за пределами функций setup loop
ISR(TIMER1_COMPA_vect)
{
 
   код опроса датчика
}

ISR(TIMER1_COMPB_vect)
{
код вывода на экран или что хочешь
TCNT1 = 0x00;
OCR1A = 0x1194;
OCR1B = ---------;
}

Код будет повторять циклический опрос твоих датчиков или что тебе там нужно.
Значение канала B должно быть больше канала A

Редактировался goodspeedmen (2018-02-06 12:48:44)

#6 2018-02-06 12:51:27

vvr
Участник
Зарегистрирован: 2015-04-12
Сообщений: 507

Re: Помогите пожалуйста с прериванием, студенту))

ну ладно, раз вам так трудно в гугле строку набрать, я уж за вас сделаю (мне не трудно да и время свободное девать некуда)
https://www.google.com/search?q=arduino+ds18b20+%D0%B1%D0%B5%D0%B7+delay&ie=utf-8&oe=utf-8&client=firefox-b-ab

почитать, надеюсь, сможите.

Редактировался vvr (2018-02-06 12:52:19)

#7 2018-02-06 13:32:42

Krolicman
Участник
Из Львів
Зарегистрирован: 2018-02-06
Сообщений: 5

Re: Помогите пожалуйста с прериванием, студенту))

Вячеслав Азаров пишет:
Krolicman пишет:

Я верю что ти в етом шариш, но можно более конкретно для тупого человека а не для такого как ти?

Вы извините, но Ардуино не для тупых человеков. Я могу рекомендовать вам литературу, и оказать консультации как репетитор, если хотите.

Человеков? О, тогда ардуино не для тебя

#8 2018-02-06 14:04:56

Krolicman
Участник
Из Львів
Зарегистрирован: 2018-02-06
Сообщений: 5

Re: Помогите пожалуйста с прериванием, студенту))

Вячеслав Азаров пишет:
Krolicman пишет:
Вячеслав Азаров пишет:

Вы извините, но Ардуино не для тупых человеков. Я могу рекомендовать вам литературу, и оказать консультации как репетитор, если хотите.

Человеков? О, тогда ардуино не для тебя

Это точно! Game over.

Просто заходиш на форум чтоб кого то унизить, а не помочь (хоть для етого создан форум). Удачи

#9 2018-02-07 08:44:21

Green
Участник
Зарегистрирован: 2015-11-08
Сообщений: 527

Re: Помогите пожалуйста с прериванием, студенту))

Унизить...
опустить...

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела