SPI + l2c

timelord
Offline
Зарегистрирован: 22.06.2017

Здравствуйте, имеется bmp280 и экранчик 5110, bmp280 подключён через l2c, а экран по SPI. По отдельности работают, а если совместить, то экранчик никак не реагирует.

скетч 

 





#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
float alt[51];
float tim[51];
float Altitude;
int samples = 40;
int maxsamples = 50;

int p = 3;
int dur = 150;
int dur2 = dur * 2;
int count;
float varC;

float varioDebug;

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

int valN = 0;
Adafruit_PCD8544 display = Adafruit_PCD8544(5, 4, 3);


#define BMP_SCK 13
#define BMP_MISO 12
#define BMP_MOSI 11
#define BMP_CS 10
boolean  fl = true;

Adafruit_BMP280 bme; // I2C

void setup() {


 
  Serial.begin(9600);
  Serial.println(F("BMP280 test"));
 

  if (!bme.begin()) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    while (1);
  }

 display.begin();
  display.setContrast(50);









}

void loop() {


  float tempo = millis();
  float vario = 0;
  float N1 = 0;
  float N2 = 0;
  float N3 = 0;
  float D1 = 0;
  float D2 = 0;
  Altitude = bme.readAltitude(1022.65);

  


  for (int cc = 1; cc <= maxsamples; cc++) {                           // усреднитель
    alt[(cc - 1)] = alt[cc];
    tim[(cc - 1)] = tim[cc];
  }

  alt[maxsamples] = Altitude;
  tim[maxsamples] = tempo;
  float stime = tim[maxsamples - samples];
  for (int cc = (maxsamples - samples); cc < maxsamples; cc++) {
    N1 += (tim[cc] - stime) * alt[cc];
    N2 += (tim[cc] - stime);
    N3 += (alt[cc]);
    D1 += (tim[cc] - stime) * (tim[cc] - stime);
    D2 += (tim[cc] - stime);
  }

  vario = 1000 * ((samples * N1) - N2 * N3) / (samples * D1 - D2 * D2);
vario = constrain(vario,-10,10);
  varioDebug = map(analogRead(2), 0, 1023, -25, 25);

  varioDebug = varioDebug * 0.1;
  
  Serial.println ("$");
  Serial.println (vario, 1);
  Serial.println (";");
varC = 20 - vario *2;

if (count >= varC) {

  fl = true;
  count = 0;
  noTone(p);
}


if ((vario > 0.5) && (vario < 10) && fl ) {

  tone(p,(800 + vario * 10),dur2 - vario * 50);
  //delay(dur2 - vario * 15);
  //noTone(p);
  fl = false;
}  else if (vario < -2) {

    tone(p, 200, 200);
    
  }   




    display.clearDisplay();

    //  display.drawLine(0, 20, 10, 20, BLACK);
    //  display.drawLine(42, 20, 15, val, BLACK);
     display.setTextSize(2);
  display.setTextColor(BLACK);
  display.setCursor(0,0);
  display.println("25");
    display.display();














delay(25);


count++;
  





}











 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Судя по коду, он и не должен реагировать.

bwn
Offline
Зарегистрирован: 25.08.2014

Странный какой-то I2C в 26-29 строках получается.((((

timelord
Offline
Зарегистрирован: 22.06.2017

это просто мусор, раньше на spi было

timelord
Offline
Зарегистрирован: 22.06.2017

спасибо, очень понятно. Может скажите в чём дело раз судя по коду ничего и не должно работать?

kalapanga
Offline
Зарегистрирован: 23.10.2016

timelord пишет:

спасибо, очень понятно. Может скажите в чём дело раз судя по коду ничего и не должно работать?

Описывайте ситуацию точнее. Ну что значит дисплей не реагирует? На нём вообще ничего не отображается? Тогда проверяйте схему подключения, сравнивайте Ваш скетч с тем, что раньше работало, проверьте пример из библиотеки дисплейной. Если же не выводится измеряемая величина, то конкретно в приведённом скетче нет ни единой строчки которая бы это делала.

timelord
Offline
Зарегистрирован: 22.06.2017

всё написано уже, никакой реакции, убираю из скетча  датчик и экран начинает работать.

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

timelord пишет:

всё написано уже, никакой реакции, убираю из скетча  датчик и экран начинает работать.

Вам то понятно, мы то не понимаем как вы "убираете из скетча  датчик"? Что комментируете в коде?

Чтобы было больше ответов предлагаю:
1. Отформатировать текст, в Arduino IDE это сочетание клавиш Ctrl+T
2. Убрать из кода неиспользуемое, я тоже повелся сначала на BMP_SCK 13 и прочее..

А пока меня смутило вот что:

float alt[51];
float tim[51];

Хотелось бы видеть сообщения компилятора. Мало того что у вас куча библиотек, так еще и такие массивы float.

К стати плата то какая? MEGA еще пойдет а на 328 чипе NANO UNO и иже с ними уже думаю не поятнут ваш скутч.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Да я бы и всю эту "усреднительную" арифметику для начала выкинул! Чтобы весь скетч состоял только из измерения и его вывода на экран. Но нам же уже всё описали - гадайте! Ни какая ардуина используется, ни схемы подключения. Есть на экране эти его "25" или нет. Есть что-нибудь в выводе в сериал или нет. В конце концов окажется, что отвалилась какая-нибудь сопля... И кстати, если автор темы в монитор порта не заглядывал, то возможно программа просто висит в цикле, не найдя датчика - вот и "никакой реакции"!

p.s. Не поленился и проверил совместную работу экранчика 5110 на аппаратном SPI и датчика BME280 (BMP280 у меня нет) на I2C c Arduino UNO. Библиотеки все Адафрутовские. Как и следовало ожидать, всё прекрасно работает вместе.

timelord
Offline
Зарегистрирован: 22.06.2017

адуино нано, в мониторе всё нормально , работает как и должно, экран не реагирует(неужели не понятен смысл слов, т.е. вообще ничего нет на нём). В скетче убирал всё что относится к датчику, типа инициализации и алгоритма рассчёта.

timelord
Offline
Зарегистрирован: 22.06.2017

проблема вот в этом

if (count >= varC) {
 

  fl = true;

  count = 0;

  noTone(p);

}

есть идеи почему?

kalapanga
Offline
Зарегистрирован: 23.10.2016

Конечно есть. На 3 пин дисплей подключен, а Вы на него Tone/noTone!

timelord
Offline
Зарегистрирован: 22.06.2017

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