Проблема при включении OLED LCD Display I2C 0.96 IIC Serial 128X64

MARKSIST
Offline
Зарегистрирован: 16.07.2015

Собираю небольшую метеостанцию.

Данные выводятся на  OLED LCD Display I2C 0.96 IIC Serial 128X64. Прикрутил к метеостанции дальномер HC-SR04. Логика такая: при приближении к метеостанции включается дисплей, при удалении от нее отключается. 

Так вот в чем вопрос: Дисплей подключен к 13 пину и дальномер следовательно открывает его и закрывает, но дисплей никак не реагирует. Так же когда питание дисплея подаю от ардуино все работает но как только выйму питани и вставлю обратно дисплей не стартует. Что это может быть.

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP085.h>
#include <Wire.h>
#include <DS1307RTC.h>
#include <Time.h>

#define OLED_RESET 4
#define Trig 9
#define Echo 8
#define Disp 13

Adafruit_SSD1306 display(OLED_RESET);
Adafruit_BMP085 bmp;
tmElements_t tm;

void setup()   {                
  Serial.begin(9600);
if (!bmp.begin()) {
	Serial.println("Could not find a valid BMP085 sensor, check wiring!");
	while (1) {}
 }
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  
  display.clearDisplay();
  RTC.read(tm);
  pinMode(Trig, OUTPUT);  
  pinMode(Echo, INPUT); 
  pinMode(Disp, OUTPUT); //13 пин - подключен дисплей
}
unsigned int impulseTime=0; 
unsigned int distance_sm=0; 

void loop() {  
                                          //ВЫВОДИМ НА ДИСПЛЭЙ
//-----------------------------------------------------------------------------------------------------
  //Температура
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.print("T= ");
  display.print(bmp.readTemperature());
  display.println(" C");
  display.display();

  //Давление
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,20);
  display.print("P= ");
  display.print(bmp.readPressure());
  display.display(); 
  
  //Часы
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,40);
  print2digits(tm.Hour);
  display.print(":");
  print2digits(tm.Minute);
  display.print(":");
  print2digits(tm.Second);
  display.display();
  delay(1000);
  display.clearDisplay();
  
                                               // ДАЛЬНОМЕР
//---------------------------------------------------------------------------------------------------- 
  digitalWrite(Trig, HIGH);
  digitalWrite(Disp, LOW); //Дисплей выключен
  /* Подаем импульс на вход trig дальномера */
  delayMicroseconds(25); // равный 10 микросекундам 
  digitalWrite(Trig, LOW); // Отключаем 
  impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса 
  distance_sm=impulseTime/58; // Пересчитываем в сантиметры 
  Serial.println(distance_sm); // Выводим на порт 
  if (distance_sm<30) // Если расстояние менее 30 сантиметром 
  {     
    digitalWrite(Disp, HIGH); // Дисплей горит 
  }  
  else 
  {   
    digitalWrite(Disp, LOW); // иначе не горит 
  }   
  delay(100); 
} 
 
void print2digits(int number) {       //Функция добавления нуля если число (часы минуты секунды) от 0 до 10
  if (number >= 0 && number < 10) {
    display.print('0');
  }
  display.print(number);
}



 

 

Гриша
Offline
Зарегистрирован: 27.04.2014

MARKSIST пишет:

Дисплей подключен к 13 пину и дальномер следовательно открывает его и закрывает...

SDA ? SCL ? RST ? VCC ? какой из, и какие есть...

MARKSIST
Offline
Зарегистрирован: 16.07.2015

К 13 пину подключен VCC(он же 5в). А есть SDA. SCL. VCC. GND.

Radjah
Offline
Зарегистрирован: 06.08.2014

Можно тупо очищать дисплей и не выводить на него ничего, пока с дальномера сигнала нет.

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

А при вырубании дисплея его надо заново инициализировать.

Гриша
Offline
Зарегистрирован: 27.04.2014

MARKSIST пишет:

К 13 пину подключен VCC(он же 5в). А есть SDA. SCL. VCC. GND.

эвано оно как.... я сним не работал, но:

1)там нога 13 еще не загнулась от тока (я не знаю его потребления)

2) ему точно не нужна инициализация после подачи питания которая прописана в сетапе? стр 24

MARKSIST
Offline
Зарегистрирован: 16.07.2015

Светодиод от 13 пина мигает (тестовый скетч) значит пи нормальный. Еще один интересный факт: питание с ардуино идет в бредборд. С бред борда питается дисплей, а дальномер питается с ардуины напрямую. Так вот когда отсоединяю VCC дисплея от бредборда то данные с дальномера перестают выводится в Serial... как это может быть связано???

Новый код с инициализацией 

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP085.h>
#include <Wire.h>
#include <DS1307RTC.h>
#include <Time.h>

#define OLED_RESET 4
#define Trig 9
#define Echo 8
#define Disp 13

Adafruit_SSD1306 display(OLED_RESET);
Adafruit_BMP085 bmp;
tmElements_t tm;

void setup()   {                
  Serial.begin(9600);
if (!bmp.begin()) {
	Serial.println("Could not find a valid BMP085 sensor, check wiring!");
	while (1) {}
 }
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 
  display.clearDisplay();
  pinMode(Trig, OUTPUT);  
  pinMode(Echo, INPUT); 
  pinMode(Disp, OUTPUT); //13 пин - подключен дисплей
}
unsigned int impulseTime=0; 
unsigned int distance_sm=0; 

void loop() {  
   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
   display.clearDisplay(); 
  
                                          //ВЫВОДИМ НА ДИСПЛЭЙ
//-----------------------------------------------------------------------------------------------------
  //Температура
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.print("T= ");
  display.print(bmp.readTemperature());
  display.println(" C");
  display.display();

  //Давление
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,20);
  display.print("P= ");
  display.print(bmp.readPressure());
  display.display(); 
  
  //Часы
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,40);
  print2digits(tm.Hour);
  display.print(":");
  print2digits(tm.Minute);
  display.print(":");
  print2digits(tm.Second);
  display.display();
  delay(1000);
  display.clearDisplay();
  
                                               // ДАЛЬНОМЕР
//---------------------------------------------------------------------------------------------------- 
  digitalWrite(Trig, HIGH);
  digitalWrite(Disp, LOW); //Дисплей выключен
  /* Подаем импульс на вход trig дальномера */
  delayMicroseconds(25); // равный 10 микросекундам 
  digitalWrite(Trig, LOW); // Отключаем 
  impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса 
  distance_sm=impulseTime/58; // Пересчитываем в сантиметры 
  Serial.println(distance_sm); // Выводим на порт 
  if (distance_sm < 30) // Если расстояние менее 30 сантиметром 
  {     
    digitalWrite(Disp, HIGH); // Дисплей горит
    
  }  
  else 
  {   
    digitalWrite(Disp, LOW); // иначе не горит 
  }   
  delay(100); 
} 
 
void print2digits(int number) {       //Функция добавления нуля если число (часы минуты секунды) от 0 до 10
  if (number >= 0 && number < 10) {
    display.print('0');
  }
  display.print(number);
}



 

Radjah
Offline
Зарегистрирован: 06.08.2014

> К 13 пину подключен VCC(он же 5в)

> питание с ардуино идет в бредборд.

Кинуть провод от 5V ардуины и питать всё с доски никак?

Нахрена каждый раз задавать шрифт и цвет?

Для вывода времени почитай про printf/sprintf

Моё сообщение про флаг ты мимо ушей/глаз пропустил.

Maverik
Offline
Зарегистрирован: 12.09.2012

зачем дальномер ? PIR датчик присутствия специально для этой цели разработан и по цене столько же если не дешевле. 

MARKSIST
Offline
Зарегистрирован: 16.07.2015

Radjah пишет:

> К 13 пину подключен VCC(он же 5в)

> питание с ардуино идет в бредборд.

Кинуть провод от 5V ардуины и питать всё с доски никак?

Нахрена каждый раз задавать шрифт и цвет?

Для вывода времени почитай про printf/sprintf

Моё сообщение про флаг ты мимо ушей/глаз пропустил.

Спасибо большое получилось. 

Я так и делал что питал всю доску от ардуины. Просто для эксперимента попробовал по другому. Вообщем цель достигнута. Дисплей выключается и включается. Спасибо. Про prinf обязательно почитаю.

Вот обновленный код может кому интересно или есть замечания. ()

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP085.h>
#include <Wire.h>
#include <DS1307RTC.h>
#include <Time.h>

#define OLED_RESET 4
#define Trig 9
#define Echo 8

Adafruit_SSD1306 display(OLED_RESET);
Adafruit_BMP085 bmp;
tmElements_t tm;

void setup()   {                
  Serial.begin(9600);
if (!bmp.begin()) {
	Serial.println("Could not find a valid BMP085 sensor, check wiring!");
	while (1) {}
 }
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 
  display.clearDisplay();
  pinMode(Trig, OUTPUT);  
  pinMode(Echo, INPUT); 
}
unsigned int impulseTime=0; 
unsigned int distance_sm=0; 

void loop() {  
                                           // ДАЛЬНОМЕР
//---------------------------------------------------------------------------------------------------- 
  
  digitalWrite(Trig, HIGH);
  /* Подаем импульс на вход trig дальномера */
  delayMicroseconds(25); // равный 10 микросекундам 
  digitalWrite(Trig, LOW); // Отключаем 
  impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса 
  distance_sm=impulseTime/58; // Пересчитываем в сантиметры 
  Serial.println(distance_sm); // Выводим на порт 
  if (distance_sm < 30) // Если расстояние менее 30 сантиметром 
  {        
  display.setTextSize(2);
  display.setTextColor(WHITE);
                                          //ВЫВОДИМ НА ДИСПЛЭЙ
//-----------------------------------------------------------------------------------------------------
  //Температура
  
  display.setCursor(0,0);
  display.print("T= ");
  display.print(bmp.readTemperature());
  display.println(" C");
  display.display();

  //Давление
  
  display.setCursor(0,20);
  display.print("P= ");
  display.print(bmp.readPressure());
  display.display(); 
  
  //Часы

  display.setCursor(0,40);
  print2digits(tm.Hour);
  display.print(":");
  print2digits(tm.Minute);
  display.print(":");
  print2digits(tm.Second);
  display.display();
  delay(1000);
  display.clearDisplay();
  }  
  else 
  {   
    display.setCursor(0,0);
    display.print(" ");
    display.display();
    display.clearDisplay();
  }   
  delay(100); 
} 
 
void print2digits(int number) {       //Функция добавления нуля если число (часы минуты секунды) от 0 до 10
  if (number >= 0 && number < 10) {
    display.print('0');
  }
  display.print(number);
}