Заменил delay(status); на delay(255);. Работает.
И это не может не радовать!
Конечно! А если ещё и на волшебном асме, так там само всё правильно пишется, @dedivan не даст соврать!
Избавился от delay() при обращении к BMP180. Работает. Но как-то сумрачно получается.
Спойлер
#include <SFE_BMP180.h>
#include <Wire.h>
// #include <SPI.h>
SFE_BMP180 pressure;
int st;
bool trigger, start_bmp180,flag1, flag2, flag3;
double cur_p, cur_t;
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, 0);
Wire.begin();
pressure.begin();
Serial.begin(9600);
}
void loop()
{
//для тактового генератора
static uint32_t period = 500;
static uint32_t moment;
//для BMP180
char status;
double T, P;
static uint32_t time_tp;
if (millis() - moment >= period)
{
moment = millis();
trigger = !trigger;
digitalWrite(13, trigger);
if (trigger) //пришел как бы секундный импульс
{
st++;
if (st == 5)
{
start_bmp180 = true;
flag1 = true;
st = 0;
}
}
}
if (start_bmp180) //запуск BMP180
{
if (flag1 == true)
{
status = pressure.startTemperature();
if (status != 0)
{
time_tp = millis();
flag2 = true;
flag1 = false;
}
}
if (flag2 == true)
{
if (millis() - time_tp >= 255)
{
status = pressure.getTemperature(T);
if (status != 0)
{
if (T > 0)
{
cur_t = T;
}
status = pressure.startPressure(3);
if (status != 0)
{
time_tp = millis();
flag3 = true;
}
}
flag2 = false;
}
}
if (flag3 == true)
{
if (millis() - time_tp >= 255)
{
status = pressure.getPressure(P, T);
if (status != 0)
{
cur_p = P * 0.750063783; //миллибары в мм рт. ст.
}
flag3 = false;
String stroka = String(cur_t, 2);
stroka += " ";
stroka += String(cur_p, 2);
Serial.println(stroka);
start_bmp180 = false;
}
}
}
}
А нафига у него (BMP180) избавляться от delay()
???
Я бы, на твоём месте, сначала заглянул бы в библиотеку. Убедился, что delay()
не критичные (нужны для “переваривания” и не более того. Прям так и говорят: “// Will return delay in ms to wait, or 0 if I2C error.”), наибольшее значение я нашел всего 26 миллисекунд и…
...потом бы сделал вот так...
#include <SFE_BMP180.h>
#include <Wire.h>
#define ledPin 13
SFE_BMP180 pressure;
void setup() {
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, 0);
Wire.begin();
pressure.begin();
Serial.begin(9600);
}
void loop() {
static uint8_t stst;
static uint32_t period = 500;
static uint32_t moment;
double cur_p, cur_t;
double T, P;
if (millis() - moment >= period) {
moment = millis();
digitalWrite(ledPin, !digitalRead(ledPin));
}
if (start_bmp180) { //запуск BMP180
status = pressure.startTemperature();
if (status != 0) {
delay(status);
status = pressure.getTemperature(T);
if (status != 0) {
//Переменная T скоро испортится.
//ее надо срочно прочитать
cur_t = T;
}
}
status = pressure.startPressure(3);
if (status != 0) {
delay(status);
status = pressure.getPressure(P, T);
if (status != 0) {
//получаем текущее давление P и переводим миллибары в мм рт. ст.
cur_p = P * 0.750063783; //миллибары в мм рт. ст.
}
}
String stroka = String(cur_t, 2);
stroka += " ";
stroka += String(cur_p, 2);
Serial.println(stroka);
start_bmp180 = false;
}
}
Я избавился от delay() не в библиотеке, а в примере. В #58 в перемнную status типа char приходит время задержки, которое надо выдержать перед запросом температуры/давления. Сначала я вместо delay(status); написал delay(255);. Так работает. Затем избавился от этих delay, используя millis().
В дальнейшем хочу попробовать обращаться к BMP180 в прерыванииях по таймеру. И уйти от millis().
Но если в библиотеке используется delay(), то это не получится сделать? Так?
Я фсё.
На большее меня в этой теме не хватит.
“Не на те места ты колокольца повесил”…
Сейчас повешу на те.
Да ты совсем малой, такую классику нужно знать.
Да кто ж не знает старика Крупского?
«Всё не так уж сумрачно вблизи», ну, если тренироваться, конечно.
0_0
Иди в школу и требуй от преподавателей чтобы они тебе знания давали, а не как ЕГЭ сдавать …
@ЕвгенийП , Евгений Петрович. Два примера от меня с его же комментариями. Толку ноль.
Я же вовремя «умыл руки»?))
Этот анекдот появидся гораздо раньше, чем ЕГЭ.
Какие именно примеры. Вчерашний пример работаетбез перерыва, до сих пор.
Как же не заметил? Я его пробовал.
Тогда зачем это было писать?
Работает из #65?))
После объявления status и когда убрал start_bmp180 работает. Там естьdelay(status)
Удалил строки с delay(status)
- работает. На фига тогда в солидной библиотек он нужен delay
.
А допускается (понимаю, что вопрос не по теме) в обработке прерывания по таймеру выводить в порт: Serial.println
?