Arduino Polska Forum
Problem z przerobieniem kodu pod wyświetlacz i2c - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Wyświetlacze (https://forum.arduinopolska.pl/dzial-wy%C5%9Bwietlacze)
+--- Wątek: Problem z przerobieniem kodu pod wyświetlacz i2c (/watek-problem-z-przerobieniem-kodu-pod-wy%C5%9Bwietlacz-i2c)



Problem z przerobieniem kodu pod wyświetlacz i2c - boksej - 16-04-2018

Witam, znalazłem na internecie to http://www.silasparker.co.uk/2013/09/euro-truck-simulator-2-prototype-real.html?m=1 problem jest taki, że dopiero co zaczynam przygodę z arduino i niewiem jak przerobić ten kod pod wyświetlacz z konwerterem pod I2C.  Tutaj daje kod :
Kod:
#include <LiquidCrystal.h>
#include <Servo.h>

const int SPEEDO_PIN      = A1;
const int RPM_PIN         = A0;
const int LEFT_INDICATOR  = A2;
const int RIGHT_INDICATOR = A3;
const int PARKING_BREAK   = A4;
const int FUEL_WARNING    = A5;


Servo speedo;
Servo rpm;



#define PACKET_SYNC 0xFF
#define PACKET_VER  2

#define SERVO_DIR_NORMAL false
#define SERVO_DIR_INVERT true

int serial_byte;

LiquidCrystal lcd(12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2);

void setup()
{
 Serial.begin(115200);
 
 lcd.begin(16, 2);
 lcd.print("Self Test");
 
 
 speedo.attach(SPEEDO_PIN);
 speedo.write(180);
 
 rpm.attach(RPM_PIN);
 rpm.write(180);
 

 pinMode(LEFT_INDICATOR, OUTPUT);
 pinMode(RIGHT_INDICATOR, OUTPUT);
 pinMode(PARKING_BREAK, OUTPUT);
 pinMode(FUEL_WARNING, OUTPUT);
 
 digitalWrite(LEFT_INDICATOR, 0);
 digitalWrite(RIGHT_INDICATOR, 0);
 digitalWrite(PARKING_BREAK, 0);
 digitalWrite(FUEL_WARNING, 0);
 
 
 delay(500);
 
 speedo.write(0);
 rpm.write(0);
 digitalWrite(LEFT_INDICATOR, 1);
 digitalWrite(RIGHT_INDICATOR, 1);
 digitalWrite(PARKING_BREAK, 1);
 digitalWrite(FUEL_WARNING, 1);
 
 
 delay(500);
 
 speedo.write(180);
 rpm.write(180);
 digitalWrite(LEFT_INDICATOR, 0);
 digitalWrite(RIGHT_INDICATOR, 0);
 digitalWrite(PARKING_BREAK, 0);
 digitalWrite(FUEL_WARNING, 0);
 
 
 lcd.clear();
 lcd.print("Wait");

 delay(1000);
 lcd.clear();
 lcd.print("Ready");
}



void read_serial_byte_set_servo(Servo& servo, bool invert)
{
 serial_byte = Serial.read();
 serial_byte = (serial_byte < 0) ? 0 : ((serial_byte > 180) ? 180 : serial_byte);
 if (invert)
   servo.write(180 - serial_byte);
 else
   servo.write(serial_byte);
}

void skip_serial_byte()
{
 (void)Serial.read();
}

void digitalWriteFromBit(int port, int value, int shift)
{
 digitalWrite(port, (value >> shift) & 0x01);
}

void loop()
{
 if (Serial.available() < 16)
   return;
 
 serial_byte = Serial.read();
 if (serial_byte != PACKET_SYNC)
   return;
   
 serial_byte = Serial.read();
 if (serial_byte != PACKET_VER)
 {
   lcd.clear();
   lcd.print("PROTOCOL VERSION ERROR");
   return;
 }
 
 read_serial_byte_set_servo(speedo, SERVO_DIR_INVERT);   
 read_serial_byte_set_servo(rpm, SERVO_DIR_INVERT);
 
 skip_serial_byte();
 skip_serial_byte();
 skip_serial_byte();
 skip_serial_byte();
 skip_serial_byte();
 skip_serial_byte();
 skip_serial_byte();
   
 

 serial_byte = Serial.read();
 digitalWriteFromBit(LEFT_INDICATOR,  serial_byte, 5);  
 digitalWriteFromBit(RIGHT_INDICATOR, serial_byte, 4);
 


 serial_byte = Serial.read();  
 digitalWriteFromBit(PARKING_BREAK, serial_byte, 7);
 digitalWriteFromBit(FUEL_WARNING, serial_byte, 3);  


 serial_byte = Serial.read();
 
 
 int text_len = Serial.read();
 

 if (0 < text_len && text_len < 127)
 {
   lcd.clear();
   for (int i = 0; i < text_len; ++i)
   {
     while (Serial.available() == 0)
     {
       delay(2);
     }
     serial_byte = Serial.read();
     if (serial_byte < 0 && serial_byte > 127)
       return;
     
     if (serial_byte == '\n')
       lcd.setCursor(0, 1);
     else
       lcd.print(char(serial_byte));
   }
 }
 
}



Z góry dzięki za pomoc i przepraszam za wszystkie błędy


RE: Problem z przerobieniem kodu pod wyświetlacz i2c - kaczakat - 16-04-2018

Przeedytuj post bo jest nieczytelny (kod). Wgrywasz bibliotekę, otwierasz przykład z I2C, w drugim oknie bez I2C, porównujesz czym się różnią i podmieniasz. Są różne biblioteki do I2C, nie wiem którą ty masz. Wybierz tę, w której nie definiuje się pinów, a jedynie podaje się adres na magistrali I2C. Jeśli masz nietypowy LCD to niestety musisz wybrać taką, gdzie się określa, co gdzie jest podłączone. Na górze szkicu dodajesz biblioteki, więc tu podmieniasz to co w include, potem tworzysz obiekt lcd, w obu tak samo, ale odwołujesz się adekwatnie do tego co wymaga biblioteka. Potem w setup robisz inicjalizację (zwykle utworzony wcześniej obiekt.begin() ) i używasz poleceń/metod/funkcji opisanych w pliku .h danej biblioteki (większość będzie taka sama, np. lcd.print("napis").


RE: Problem z przerobieniem kodu pod wyświetlacz i2c - Robson Kerman - 16-04-2018

(16-04-2018, 12:34)kaczakat napisał(a):  Są różne biblioteki do I2C, nie wiem którą ty masz. Wybierz tę, w której nie definiuje się pinów, a jedynie podaje się adres na magistrali I2C. Jeśli masz nietypowy LCD to niestety musisz wybrać taką, gdzie się określa, co gdzie jest podłączone. 

To jest jedna biblioteka.
Tam są przeciążone funkcje, więc wybierasz, która Ci pasuje.

Kod:
  LiquidCrystal_I2C (uint8_t lcd_Addr);

  LiquidCrystal_I2C (uint8_t lcd_Addr, uint8_t backlighPin, t_backlighPol pol);

  LiquidCrystal_I2C( uint8_t lcd_Addr, uint8_t En, uint8_t Rw, uint8_t Rs);

  LiquidCrystal_I2C(uint8_t lcd_Addr, uint8_t En, uint8_t Rw, uint8_t Rs,
              uint8_t backlighPin, t_backlighPol pol);  
 
  LiquidCrystal_I2C(uint8_t lcd_Addr, uint8_t En, uint8_t Rw, uint8_t Rs,
                    uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7 );

  LiquidCrystal_I2C(uint8_t lcd_Addr, uint8_t En, uint8_t Rw, uint8_t Rs,
                    uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7,
                    uint8_t backlighPin, t_backlighPol pol);



RE: Problem z przerobieniem kodu pod wyświetlacz i2c - boksej - 16-04-2018

(16-04-2018, 12:34)kaczakat napisał(a): Przeedytuj post bo jest nieczytelny (kod). Wgrywasz bibliotekę, otwierasz przykład z I2C, w drugim oknie bez I2C, porównujesz czym się różnią i podmieniasz. Są różne biblioteki do I2C, nie wiem którą ty masz. Wybierz tę, w której nie definiuje się pinów, a jedynie podaje się adres na magistrali I2C. Jeśli masz nietypowy LCD to niestety musisz wybrać taką, gdzie się określa, co gdzie jest podłączone. Na górze szkicu dodajesz biblioteki, więc tu podmieniasz to co w include, potem tworzysz obiekt lcd, w obu tak samo, ale odwołujesz się adekwatnie do tego co wymaga biblioteka. Potem w setup robisz inicjalizację (zwykle utworzony wcześniej obiekt.begin() ) i używasz poleceń/metod/funkcji opisanych w pliku .h danej biblioteki (większość będzie taka sama, np. lcd.print("napis").
Już przeedytowałem post ale dalej nierozumiem Sad


RE: Problem z przerobieniem kodu pod wyświetlacz i2c - kaczakat - 16-04-2018

Acha. Bibliotekę LiquidCrystal_I2C już dodałeś do bibliotek Arduino? Może opisz na jakim etapie z przeróbką jesteś.


RE: Problem z przerobieniem kodu pod wyświetlacz i2c - boksej - 17-04-2018

(16-04-2018, 21:30)kaczakat napisał(a): Acha. Bibliotekę LiquidCrystal_I2C już dodałeś do bibliotek Arduino? Może opisz na jakim etapie z przeróbką jesteś.

Po podmieniałem wszystko i ten program co wcześniej miałem hello World został a ten co przerobiłem niedziala


RE: Problem z przerobieniem kodu pod wyświetlacz i2c - kaczakat - 17-04-2018

No ale pokaż jaki jest stan szkicu po zmianach.