Дисплей LCD1602 I2C мерцает подсветка/контрастность

DenisStifler93
Offline
Зарегистрирован: 12.03.2018

Подскажите, подключил LCD 1602 по I2C, и при работе заметил что мерцает и подсветка и контрасность (шрифт то белый то немного темнее), думал питания не хватает, замерил то 5.03В. Кто сталкивался с такой бедой, что делать? Заранее спасибо.

Скетч:

#include <IRremote.h>
#include <Adafruit_NeoPixel.h>
#include <DHT.h>
#define DHTPIN 3
#define RGBPIN 4
#define DHTTYPE DHT11
#define NUMPIXELS 16
#define RELAY 5
IRrecv irrecv(2);
decode_results results;

DHT dht(DHTPIN, DHTTYPE);
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, RGBPIN, NEO_GRB + NEO_KHZ800);

void setup()
{
  irrecv.enableIRIn();
  dht.begin();
  strip.begin();
  strip.show();
  strip.show();
  pinMode(RELAY, OUTPUT);
  digitalWrite(RELAY, HIGH);
}

void loop()
{
 if ( irrecv.decode( &results )) {
    switch ( results.value ) {
    case 0xFFA857: // Button -        
        digitalWrite(RELAY, LOW);
        break;
    case 0xFFE01F: // Button +
        digitalWrite(RELAY, HIGH);        
        break;
    case 0xFF30CF: // Button 1 - WHITE
        setRGB(255, 255, 255);        
        break;
    case 0xFF18E7: // Button 2 - GREEN
        setRGB(0, 255, 0);        
        break;
    case 0xFF7A85: // Button 3 - BLUE
        setRGB(0, 0, 255);        
        break;
    case 0xFF10EF: // Button 4 - AQUA
        setRGB(0, 255, 255);        
        break;
    case 0xFF38C7: // Button 5 - PURP  
        setRGB(204, 0, 255);        
        break;
    case 0xFF5AA5: // Button 6 - RED 
        setRGB(255, 0, 0);        
        break;
    case 0xFF42BD: // Button 7 - ORANGE
        setRGB(255, 191, 0);        
        break;
    case 0xFF4AB5: // Button 8 - PINK
        setRGB(255, 0, 191);        
        break;
    case 0xFF52AD: // Button 9 - YELLOW
        setRGB(255, 255, 0);        
        break;    
    case 0xFF6897: // Button 0 - OFF
        setRGB(0, 0, 0);        
        break;                                    
    }    
    irrecv.resume();
  } 
}



void setRGB(int R, int G, int B)
{
  for(int i=0;i<NUMPIXELS;i++)
  {   
    strip.setPixelColor(i, strip.Color(R,G,B)); 
    strip.show();
  }
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

в ЭТОМ скетче, нихрена про дисплей нет. 

DenisStifler93
Offline
Зарегистрирован: 12.03.2018
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <Adafruit_NeoPixel.h>
#include <DHT.h>
#include <IRremote.h>
#define DHTPIN 3
#define DHTTYPE DHT11
#define RELAY 5
#define RGBPIN 4
#define NUMPIXELS 16

LiquidCrystal_I2C lcd(0x3F,16,2);
DHT dht(DHTPIN, DHTTYPE);
IRrecv irrecv(2);
decode_results results;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, RGBPIN, NEO_GRB + NEO_KHZ800);
int count;
  
void setup()
{
  lcd.init();
  lcd.backlight();                     
  lcd.print("T:");
  lcd.setCursor(0, 1);
  lcd.print("H:");
  lcd.setCursor(6, 0);
  lcd.print("Lamp:");
  lcd.setCursor(6, 1);
  lcd.print("Led:");
  lcd.setCursor(11, 0);
  lcd.print("OFF");
  lcd.setCursor(10, 1);
  lcd.print("OFF");
  dht.begin();
  pinMode(RELAY, OUTPUT);
  digitalWrite(RELAY, HIGH);
  irrecv.enableIRIn();
  strip.begin();
  strip.show();
  strip.show();
}
void loop()
{
  getTemperatureAndHumidity();
  getPhotoResistor();
    
  if ( irrecv.decode( &results )) {
    switch ( results.value ) {
    case 0xFFA857: // Button -        
        digitalWrite(RELAY, LOW);
        lcd.setCursor(11, 0);
        lcd.print("   ");
        lcd.setCursor(11, 0);
        lcd.print("ON");
        break;
    case 0xFFE01F: // Button +
        digitalWrite(RELAY, HIGH);        
        lcd.setCursor(11, 0);
        lcd.print("   ");
        lcd.setCursor(11, 0);
        lcd.print("OFF");
        break;
    case 0xFF30CF: // Button 1 - WHITE
        setRGB(255, 255, 255);
        lcd.setCursor(10, 1);
        lcd.print("       ");
        lcd.setCursor(10, 1);
        lcd.print("WHITE");        
        break;
    case 0xFF18E7: // Button 2 - GREEN
        setRGB(0, 255, 0);        
        lcd.setCursor(10, 1);
        lcd.print("       ");
        lcd.setCursor(10, 1);
        lcd.print("GREEN");
        break;
    case 0xFF7A85: // Button 3 - BLUE
        setRGB(0, 0, 255);        
        lcd.setCursor(10, 1);
        lcd.print("       ");
        lcd.setCursor(10, 1);
        lcd.print("BLUE");
        break;
    case 0xFF10EF: // Button 4 - AQUA
        setRGB(0, 255, 255);        
        lcd.setCursor(10, 1);
        lcd.print("       ");
        lcd.setCursor(10, 1);
        lcd.print("AQUA");
        break;
    case 0xFF38C7: // Button 5 - PURP  
        setRGB(204, 0, 255);
        lcd.setCursor(10, 1);
        lcd.print("       ");
        lcd.setCursor(10, 1);
        lcd.print("PURPLE");        
        break;
    case 0xFF5AA5: // Button 6 - RED 
        setRGB(255, 0, 0);
        lcd.setCursor(10, 1);
        lcd.print("       ");
        lcd.setCursor(10, 1);
        lcd.print("RED");        
        break;
    case 0xFF42BD: // Button 7 - ORANGE
        setRGB(255, 191, 0);        
        lcd.setCursor(10, 1);
        lcd.print("       ");
        lcd.setCursor(10, 1);
        lcd.print("ORANGE");
        break;
    case 0xFF4AB5: // Button 8 - PINK
        setRGB(255, 0, 191);        
        lcd.setCursor(10, 1);
        lcd.print("       ");
        lcd.setCursor(10, 1);
        lcd.print("PINK");
        break;
    case 0xFF52AD: // Button 9 - YELLOW
        setRGB(255, 255, 0);        
        lcd.setCursor(10, 1);
        lcd.print("       ");
        lcd.setCursor(10, 1);
        lcd.print("YELLOW");
        break;    
    case 0xFF6897: // Button 0 - OFF
        setRGB(0, 0, 0); 
        lcd.setCursor(10, 1);
        lcd.print("       ");
        lcd.setCursor(10, 1);
        lcd.print("OFF");       
        break;
    case 0xFFA25D: // CH- -    
        break;
    case 0xFF629D: // CH - 
        break;
    case 0xFFE21D: // CH+       
        break;
        case 0xFF22DD: // VOL- - BACKLIGHT
        count--;       
        setBackLight(count);        
        break; 
    case 0xFF02FD: // VOL+ - BACKLIGHT
        count++;       
        setBackLight(count);         
        break;
    case 0xFFC23D: // >|| - 0%_BACKLIGHT
        setBackLight(0);        
        break;
    case 0xFF906F: // EQ - 100%_BACKLIGHT
        setBackLight(7);        
        break;                                     
    }    
    irrecv.resume();
  } 
}

void getTemperatureAndHumidity()
{
  byte temp = dht.readTemperature();
  byte hum = dht.readHumidity();

  lcd.setCursor(2, 0);
  lcd.print(temp);
  lcd.print("C");
  
  lcd.setCursor(2, 1);
  lcd.print(hum);
  lcd.print("%");

  delay(1000);
}

void setRGB(int R, int G, int B)
{
  for(int i=0;i<NUMPIXELS;i++)
  {   
    strip.setPixelColor(i, strip.Color(R,G,B)); 
    strip.show();
  }
}

void getPhotoResistor() 
{
  int photocellPin = 0;
  int photocellReading;
  photocellReading = analogRead(photocellPin);
  lcd.setCursor(14, 0);
  lcd.print(photocellReading);
}

void setBackLight(int counter)
{
  switch (counter) {
    case 1: 
        analogWrite(6, 5);      
        break;
    case 2: 
        analogWrite(6, 25);      
        break;
    case 3: 
        analogWrite(6, 50);      
        break;
    case 4: 
        analogWrite(6, 100);      
        break;
   case 5: 
        analogWrite(6, 150);      
        break;
   case 6: 
        analogWrite(6, 200);      
        break;
   case 7: 
        analogWrite(6, 255);   
        break;
   case 0: 
        analogWrite(6, 0);   
        break;
  }

  
  
}

 

 

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

DenisStifler93 пишет:

Подскажите, подключил LCD 1602 по I2C, 

Через что и как подключали? (можно не расписсывать, а ссылками на URL).

Прокомментируйте свои оценки дисплея, коротко...

 

DenisStifler93
Offline
Зарегистрирован: 12.03.2018

Извиняюсь, не тот скетч. прикрепил то что нужно

DenisStifler93
Offline
Зарегистрирован: 12.03.2018

Arduino Nano - LCD i2C

GND                   GND

5V                       5V

A4                       SDA

A5                       SCL

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Простите, что-то я туплю. Где в этом скетче вывод на экран?

DenisStifler93
Offline
Зарегистрирован: 12.03.2018

Ниже 2 скетч я выложил.

sadman41
Offline
Зарегистрирован: 19.10.2016

По синему квадратному резистору постучите. За контраст он отвечает.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не долбите экран при каждом проходе loop - выводите только тогда, когда что-то меняется. Вы же выводите постоянно с хз какой частотой.

DenisStifler93
Offline
Зарегистрирован: 12.03.2018

Как реализовать вывод когда что-то меняется?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

запоминать, что выводил в последний раз в данное поле и прежде чем выводить новое, сравнивать со старым. Поменялось - выводить, не поменялось - не выводить.

DenisStifler93
Offline
Зарегистрирован: 12.03.2018

ага понял спасибо. А может такое быть что питание проседает? ну т.е. к Arduino подлюченно IR датчик, Реле, Датчик температуры и влажности, ну и дисплей, а сама Arduino питаеться от БП 9V 0.6A 

DenisStifler93
Offline
Зарегистрирован: 12.03.2018

Потому что заметил такую особенность когда реле выключенно то дисплей отображается хорошо.

Когда с пульта включаю реле то дисплей (контрасность) ухудшается.

Выключаю реле и контрастность дисплея вновь становиться хорошей

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

DenisStifler93 пишет:

а сама Arduino питаеться от БП 9V 0.6A 

Как мне кажется (IMHO) 0.6А - маловато будет на всё это.

 

DenisStifler93
Offline
Зарегистрирован: 12.03.2018

1A лучше?

sadman41
Offline
Зарегистрирован: 19.10.2016

DenisStifler93 пишет:

Потому что заметил такую особенность когда реле выключенно то дисплей отображается хорошо.

Выключаю реле и контрастность дисплея вновь становиться хорошей

Вот видите - немного наблюдательности и проблемное место обнаружено.

Питайте реле от более мощного источника. Или воткните ардуину во что-нить амперное-двухамперное

DenisStifler93
Offline
Зарегистрирован: 12.03.2018

sadman41 пишет:

DenisStifler93 пишет:

Потому что заметил такую особенность когда реле выключенно то дисплей отображается хорошо.

Выключаю реле и контрастность дисплея вновь становиться хорошей

Вот видите - немного наблюдательности и проблемное место обнаружено.

Питайте реле от более мощного источника. Или воткните ардуину во что-нить амперное-двухамперное

Ну реле впринципе могу питать от USB компьютера (5V 0,5А) Землю реле и arduino надо соединять?. А если 9V 2A в Arduino Nano ничего не подпалиться? скажем контроллер питания к примеру. Просто вроде бы где-то читал что максимум 1,5А можно.

b707
Offline
Зарегистрирован: 26.05.2017

DenisStifler93 пишет:

Arduino Nano - LCD i2C

GND                   GND

5V                       5V

A4                       SDA

A5                       SCL

 

А CS пина на колодке разве нет?

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

b707 пишет:

DenisStifler93 пишет:

Arduino Nano - LCD i2C

GND                   GND

5V                       5V

A4                       SDA

A5                       SCL

 

А CS пина на колодке разве нет?

Прежде, чем искать пины, хорошо бы узнать что там за модель интерфейса (по картинке не видно).

Но не допросишься...

 

DenisStifler93
Offline
Зарегистрирован: 12.03.2018

Нет.

b707
Offline
Зарегистрирован: 26.05.2017

Olej пишет:

Прежде, чем искать пины, хорошо бы узнать что там за модель интерфейса (по картинке не видно).

Судя по картинке - вот:

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

CS для I2C  не нужен. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Что там узнавать-то... I2C переходники у 99% покупателй алиэкспресса одинаковые. CS там не нужно.

sadman41
Offline
Зарегистрирован: 19.10.2016

DenisStifler93 пишет:

Ну реле впринципе могу питать от USB компьютера (5V 0,5А) Землю реле и arduino надо соединять?. А если 9V 2A в Arduino Nano ничего не подпалиться? скажем контроллер питания к примеру. Просто вроде бы где-то читал что максимум 1,5А можно.

В принципе можете, если на реле найдете потребляемый ток и сравните с подаваемым.

Ну и прежде чем ответить на вопрос о том, сколько ампер сувать в ардуину - тоже было бы неплохо узнать, сколько жрет реле. А то, может, оно пожрет все амперы, до которых дотянется.

DenisStifler93
Offline
Зарегистрирован: 12.03.2018

Проблема явно была в питании, реле подключил к USB компьютера и диспей начал нормально отображаться без проблем. К реле подключен обычный светильник.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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