Arduino UNO разбушевалась

Заменил delay(status); на delay(255);. Работает.

И это не может не радовать! :slight_smile:

Конечно! А если ещё и на волшебном асме, так там само всё правильно пишется, @dedivan не даст соврать!

2 лайка

Избавился от 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(), то это не получится сделать? Так?

Я фсё.
На большее меня в этой теме не хватит.
“Не на те места ты колокольца повесил”…

1 лайк

Сейчас повешу на те.

Да ты совсем малой, такую классику нужно знать.

Да кто ж не знает старика Крупского?

«Всё не так уж сумрачно вблизи», ну, если тренироваться, конечно.

1 лайк

0_0

Иди в школу и требуй от преподавателей чтобы они тебе знания давали, а не как ЕГЭ сдавать …

@ЕвгенийП , Евгений Петрович. Два примера от меня с его же комментариями. Толку ноль.
Я же вовремя «умыл руки»?))

Этот анекдот появидся гораздо раньше, чем ЕГЭ.

Какие именно примеры. Вчерашний пример работаетбез перерыва, до сих пор.

Второй в #65. Не заметил чтоли?

Как же не заметил? Я его пробовал.

Тогда зачем это было писать?

Работает из #65?))

После объявления status и когда убрал start_bmp180 работает. Там естьdelay(status)

Удалил строки с delay(status) - работает. На фига тогда в солидной библиотек он нужен delay.

А допускается (понимаю, что вопрос не по теме) в обработке прерывания по таймеру выводить в порт: Serial.println ?