miért ír hülyeséget az LCD-re?

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
holex
Biztosítékgyilkos
Hozzászólások: 70
Csatlakozott: 2013. október 29. kedd, 1:35

miért ír hülyeséget az LCD-re?

Hozzászólás Szerző: holex »

Van egy LCD kijelzőm, és 4 gombom a menüben való navigáláshoz. Ha a főoldalról belépek az enter gombbal a menübe, akkor 20-ból 19-szer jól működik, behozza a menüt, egyszer viszont totál zagyvaságokat ír ki. Miért? Csináltam több képet is, mert a hülyeségek között felfedezni véltem valamiféle mintát (ezért gondolom nem érintkezési hiba lehet).

Itt vannak a képek: http://data.hu/get/7183323/hiba.zip

Kód: Egész kijelölése

#include <MenuBackend.h>    //MenuBackend library - copyright by Alexander Brevig
#include <LiquidCrystal.h>  //this library is included in the Arduino IDE
#include <EEPROM.h>
#include <OneWire.h>

#define debounceDelay 300

const byte buttonPinLeft = 52;      // pin for the Up button
const byte buttonPinRight = 53;    // pin for the Down button
const byte buttonPinEsc = 50;     // pin for the Esc button
const byte buttonPinEnter = 51;   // pin for the Enter button
const byte eeprom_fenyero=1;
const byte hattervilagitas=7;

volatile byte lastButtonPushed = 0;
volatile boolean menuben=false;
volatile byte fenyero;

volatile unsigned long utolsoGombnyomasIdeje = 0; 


byte addr[8]={40,65,64,5,5,0,0,1}; //a homero 64 bites hardveres címe
byte homeroelerheto=0;
boolean alarm=false;

int egesz, tort;
boolean negativ=false;




LiquidCrystal lcd(22, 23, 24, 25, 26, 27);
OneWire ds(38);  // homero pin8

//Menu variables
MenuBackend menu = MenuBackend(menuUsed,menuChanged);
//initialize menuitems
MenuItem setTime = MenuItem("setTime");
MenuItem setHour = MenuItem("setHour");
MenuItem setMin = MenuItem("setMin");
MenuItem setSec = MenuItem("setSec");
MenuItem setDisplay = MenuItem("setDisplay");
MenuItem setBrightness = MenuItem("setBrightness");
MenuItem setHoldTime = MenuItem("setHoldTime");


void setup()
{
  pinMode(buttonPinLeft, INPUT);
  pinMode(buttonPinRight, INPUT);
  pinMode(buttonPinEnter, INPUT);
  pinMode(buttonPinEsc, INPUT);
  pinMode(hattervilagitas, OUTPUT);
  fenyero=EEPROM.read(eeprom_fenyero);
  analogWrite(hattervilagitas,(byte)(fenyero*2.55));

  lcd.begin(20, 4);
  


  //configure menu
  menu.getRoot().add(setDisplay);
  menu.getRoot().add(setTime);
  setTime.addRight(setDisplay);

  setTime.add(setSec);
  setTime.add(setMin);
  setTime.add(setHour);
  setHour.addRight(setMin);
  setMin.addRight(setSec);

  setDisplay.add(setHoldTime);
  setDisplay.add(setBrightness);
  setBrightness.addRight(setHoldTime);

  menu.toRoot();
  //  setDS18B20resolution(12);
  
  attachInterrupt(0,pushNavigateButton,RISING);
  
} 


void loop()
{
  getTemp();
  if (menu.getCurrent().getName()==menu.getRoot()) writeTemp();
}


void menuChanged(MenuChangeEvent changed){
  lcd.clear();
  MenuItem newMenuItem=changed.to; //get the destination menu
  lcd.setCursor(0,0); //set the start position for lcd printing to the second row

  if(newMenuItem.getName()==menu.getRoot()){
    lcd.print("Homerseklet:");
    lcd.setCursor(18,0);
    lcd.write(223);
    lcd.print("C");
    lcd.setCursor(0,1);
    lcd.print("Ido:      ");


  }
  else if(newMenuItem.getName()=="setTime"){
    lcd.print("[Orabeallitas      ]");
    lcd.setCursor(0,1);
    lcd.print("Kijelzo beallitas");
  }
  else if(newMenuItem.getName()=="setHour"){
    lcd.print("[Ora               ]");
    lcd.setCursor(0,1);
    lcd.print("Perc");
    lcd.setCursor(0,2);
    lcd.print("Masodperc");
  }
  else if(newMenuItem.getName()=="setMin"){
    lcd.print("Ora");
    lcd.setCursor(0,1);
    lcd.print("[Perc              ]");
    lcd.setCursor(0,2);
    lcd.print("Masodperc");
  }
  else if(newMenuItem.getName()=="setSec"){
    lcd.print("Ora");
    lcd.setCursor(0,1);
    lcd.print("Perc");
    lcd.setCursor(0,2);
    lcd.print("[Masodperc         ]");
  }
  else if(newMenuItem.getName()=="setDisplay"){
    lcd.print("Orabeallitas");
    lcd.setCursor(0,1);
    lcd.print("[Kijelzo beallitas ]");
  }
  else if(newMenuItem.getName()=="setBrightness"){
    lcd.print("[Fenyero");
    if (fenyero==100) lcd.setCursor(15,0); 
    else if (fenyero>9) lcd.setCursor(16,0); 
    else lcd.setCursor(17,0);
    lcd.print(fenyero);
    lcd.print("%]");
    lcd.setCursor(0,1);
    lcd.print("Tartasi ido");
  }
  else if(newMenuItem.getName()=="setHoldTime"){
    lcd.print("Fenyero");
    if (fenyero==100) lcd.setCursor(16,0); 
    else if (fenyero>9) lcd.setCursor(17,0); 
    else lcd.setCursor(17,0);
    lcd.print(fenyero);
    lcd.print("%]");
    lcd.setCursor(0,1);
    lcd.print("[Tartasi ido       ]");
  }
}

void menuUsed(MenuUseEvent used){


  if (used.item.getName()==setBrightness && lastButtonPushed==buttonPinRight) {
    if (fenyero>0){
      fenyero=fenyero-5;
      analogWrite(hattervilagitas,(byte)(fenyero*2.55));

      if (fenyero==100){
        lcd.setCursor(15,0); 
        lcd.print(fenyero);
      }
      else if (fenyero>9) {
        lcd.setCursor(15,0); 
        lcd.print(" "); 
        lcd.print(fenyero);
      }
      else {
        lcd.setCursor(15,0); 
        lcd.print("  "); 
        lcd.print(fenyero);
      }
    }
  }
  else  if (used.item.getName()==setBrightness && lastButtonPushed==buttonPinLeft) {
    if (fenyero<100){
      fenyero=fenyero+5;

      analogWrite(hattervilagitas,(byte)(fenyero*2.55));

      if (fenyero==100){
        lcd.setCursor(15,0); 
        lcd.print(fenyero);
      }
      else if (fenyero>9) {
        lcd.setCursor(15,0); 
        lcd.print(" "); 
        lcd.print(fenyero);
      }
      else {
        lcd.setCursor(15,0); 
        lcd.print("  "); 
        lcd.print(fenyero);
      }
    }
  }
  if (used.item.getName()==setMin && lastButtonPushed==buttonPinRight) {
    lcd.setCursor(0,0); 
    lcd.print("PERC+");
  }
  if (used.item.getName()==setMin && lastButtonPushed==buttonPinLeft) {
    lcd.setCursor(0,0); 
    lcd.print("PERC-");
  }

  //  menu.toRoot();  //back to Main
}


//MEGSZAKITASOK

void pushNavigateButton(){
  if (abs(millis()-utolsoGombnyomasIdeje>debounceDelay)){
    utolsoGombnyomasIdeje=millis();
    if (digitalRead(buttonPinEsc)==HIGH) pushEsc();
    else if (digitalRead(buttonPinEnter)==HIGH) pushEnter();
    else if (digitalRead(buttonPinLeft)==HIGH) pushLeft();
    else if (digitalRead(buttonPinRight)==HIGH) pushRight();
  }

}

void pushEnter(){
  lastButtonPushed=buttonPinEnter;
  MenuItem currentMenu=menu.getCurrent();
  if(!(currentMenu.moveDown())) menuben=true;
  else menu.moveDown();
}

void pushEsc(){
  lastButtonPushed=buttonPinEsc;
  MenuItem currentMenu=menu.getCurrent();
  if (currentMenu.getName()==setBrightness && menuben==true) EEPROM.write(eeprom_fenyero,fenyero); 
  if (menuben==true) menuben=false; 
  else menu.moveUp();
}

void pushRight(){
  lastButtonPushed=buttonPinRight;
  //    MenuItem currentMenu=menu.getCurrent();
  if (menuben==false) menu.moveRight(); 
  else menu.use();
}

void pushLeft(){
  lastButtonPushed=buttonPinLeft;
  //    MenuItem currentMenu=menu.getCurrent();
  if (menuben==false) menu.moveLeft(); 
  else menu.use();
}


void writeTemp(){

  lcd.setCursor(13,0);
  if (negativ) // If its negative
  {
    if (egesz<10) lcd.print(" ");
    lcd.print("-");
  }
  else if (egesz<100 && egesz>=10) lcd.print(" ");
  else lcd.print("  ");
  lcd.print(egesz);
  lcd.print(".");
  lcd.print(tort); //tortresz
}



void getTemp() {
  int Tc_100, Whole, TReading;
  byte i;
  byte data[9];

  ds.reset();
  ds.select(addr);
  ds.write(0x44);         //elküldi a parancsot a konverzió végrehajtására a hőmérőnek

  //  delay(850);           //a konverzió időbe telik 9bit:100, 10bit:200, 11bit:400, 12bit:800

  homeroelerheto=ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // beolvasási parancs küldése a hőmérőnek

  if (!homeroelerheto){
       lcd.setCursor(0,1);
       lcd.print("HIBA");
       return;
  }


  for (i = 0; i < 9; i++)           //beolvassuk a SratchPad-et
    data[i] = ds.read();

  if (OneWire::crc8(data, 8) != data[8]) {
    lcd.setCursor(0,1);
    lcd.print("CRC HIBA");
    return;
  }

  TReading=(data[1] << 8) + data[0];
  if (TReading & 0x8000) // negative
  {
    TReading = (TReading ^ 0xffff) + 1; // 2's comp
    negativ=true;
  }
  else negativ=false;
  Tc_100 = (int)(6.25 * TReading);    // multiply by (100 * 0.0625) or 6.25
  egesz = Tc_100 / 100;  // egeszresz
  tort=(Tc_100 % 100)/10; //tortresz
}

void setDS18B20resolution(byte felbontas){
  ds.reset();
  ds.select(addr);    
  ds.write(0x4E);          // write scratchpad (starts at byte 2)
  // note:  set high/low temp alarms by changing the next two values 
  ds.write(0x4B);    // default value of TH reg (user byte 1)
  ds.write(0x46);    // default value of TL reg (user byte 2)
  if (felbontas==9) ds.write(0x1F);  // 9-bit
  else if (felbontas==10) ds.write(0x3F);    // 10-bit
  else if (felbontas==11) ds.write(0x5F);    // 11-bit
  else ds.write(0x7F);    // 12-bit sampling resolution (default)
}



holex
Biztosítékgyilkos
Hozzászólások: 70
Csatlakozott: 2013. október 29. kedd, 1:35

Re: miért ír hülyeséget az LCD-re?

Hozzászólás Szerző: holex »

Egyébként úgy vettem észre, hogy ez csak a főoldal és a menü közötti mozgásnál van, az almenük között már nem.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: miért ír hülyeséget az LCD-re?

Hozzászólás Szerző: Robert »

A "menubackend" függvénykönyvtárat tudod csatolni?
holex
Biztosítékgyilkos
Hozzászólások: 70
Csatlakozott: 2013. október 29. kedd, 1:35

Re: miért ír hülyeséget az LCD-re?

Hozzászólás Szerző: holex »

Persze, mellékelem.
Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.
Válasz küldése