• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Problem z przerobieniem kodu pod wyświetlacz i2c
#1
Witam, znalazłem na internecie to http://www.silasparker.co.uk/2013/09/eur...l.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
 
Odpowiedź
#2
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").
 
Odpowiedź
#3
(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);
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#4
(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
 
Odpowiedź
#5
Acha. Bibliotekę LiquidCrystal_I2C już dodałeś do bibliotek Arduino? Może opisz na jakim etapie z przeróbką jesteś.
 
Odpowiedź
#6
(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
 
Odpowiedź
#7
No ale pokaż jaki jest stan szkicu po zmianach.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości