Проблема при включении OLED LCD Display I2C 0.96 IIC Serial 128X64
- Войдите на сайт для отправки комментариев
Чт, 16/07/2015 - 15:38
Собираю небольшую метеостанцию.
Данные выводятся на 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);
}
Дисплей подключен к 13 пину и дальномер следовательно открывает его и закрывает...
SDA ? SCL ? RST ? VCC ? какой из, и какие есть...
К 13 пину подключен VCC(он же 5в). А есть SDA. SCL. VCC. GND.
Можно тупо очищать дисплей и не выводить на него ничего, пока с дальномера сигнала нет.
Для текстовых дисплеев можно подсветку отключать, например.
А при вырубании дисплея его надо заново инициализировать.
К 13 пину подключен VCC(он же 5в). А есть SDA. SCL. VCC. GND.
эвано оно как.... я сним не работал, но:
1)там нога 13 еще не загнулась от тока (я не знаю его потребления)
2) ему точно не нужна инициализация после подачи питания которая прописана в сетапе? стр 24
Светодиод от 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); }> К 13 пину подключен VCC(он же 5в)
> питание с ардуино идет в бредборд.
Кинуть провод от 5V ардуины и питать всё с доски никак?
Нахрена каждый раз задавать шрифт и цвет?
Для вывода времени почитай про printf/sprintf
Моё сообщение про флаг ты мимо ушей/глаз пропустил.
зачем дальномер ? PIR датчик присутствия специально для этой цели разработан и по цене столько же если не дешевле.
> К 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); }