Ви не увійшли.
При нажатие кнопки должни менятса значение на екране (например: при 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);
}
}
Неактивний
отказаться от библиотеки для датчиков.
там заложена делеем задержка, необходимая для получения данных.
в сети куча примеров как работать с этим датчиком без задержек.
Может ти подскажеш єсли сталкивалса с етим? или хоть силочку даш, а то я не отличу то что нужно от того что там будет
Неактивний
Krolicman пише:При нажатие кнопки должни менятса значение на екране (например: при 1 нажатие позанаие 1 датчика, при 2 нажатие показание 2 датчика температури, и т.д.) но проблема заключаетса в том что датчик DS18B20 обрабативаетса там примерно 0.7секунд, тоесть когда я нажимаю кнопку то ифнормация на екранах не меняетса. А когда я нажимаю на кнопку и держу примерно 2 секунди и потом отпускаю, то информация переключаетса. Подсказали что нужно сделать преривание но у меня не виходит, помогите кто в етом шарит)))
Корректно выполнять эти функции, из существующих библиотек, асинхронно можно только с помощью монитора вытесняющей многозадачности. Или как сейчас это модно называть - RTOS.
Я верю что ти в етом шариш, но можно более конкретно для тупого человека а не для такого как ти?
Неактивний
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)
Неактивний
ну ладно, раз вам так трудно в гугле строку набрать, я уж за вас сделаю (мне не трудно да и время свободное девать некуда)
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)
Неактивний
Krolicman пише:Я верю что ти в етом шариш, но можно более конкретно для тупого человека а не для такого как ти?
Вы извините, но Ардуино не для тупых человеков. Я могу рекомендовать вам литературу, и оказать консультации как репетитор, если хотите.
Человеков? О, тогда ардуино не для тебя
Неактивний
Krolicman пише:Вячеслав Азаров пише:Вы извините, но Ардуино не для тупых человеков. Я могу рекомендовать вам литературу, и оказать консультации как репетитор, если хотите.
Человеков? О, тогда ардуино не для тебя
Это точно! Game over.
Просто заходиш на форум чтоб кого то унизить, а не помочь (хоть для етого создан форум). Удачи
Неактивний
Унизить...
опустить...
Неактивний