Go Down

Topic: controlar el contraste de lcd mediante pin pwm (Read 3062 times) previous topic - next topic

dewasha

me gustaria controlar el contraste y el brillo pero bueno con entender como funciona el contraste sabre hacer el resto del trabajo xd el caso esque el esquema es este:

Code: [Select]
/*


08. Bibioteca agregada originalmente el 18 Apr 2008 por David A. Mellis
09. Modificada el 2009-07-05 por Limor Fried (http://www.ladyada.net)
10. Ejemplo agregado el 2009-07-09 por Tom Igoe
11. Modificado el 2009-07-25 por David A. Mellis
12. Modificado en 2010-04 por Antonio Maldonado (http://www.confusion.com.mx)
13.*/
14.
15.//Incluír la biblioteca:
16.#include <liquidcrystal .h>
17.
18.//Inicializa la biblioteca con las terminales adecuadas
19.LiquidCrystal LCD(7, 8, 9, 10, 11, 12);
20.int estadoBt1 = 0;
21.int estadoBt2 = 0;
22.int contraste = 100;
23.
24.void setup() {
25.  //Configura el tamaño del LCD en filas y columnas
26.  LCD.begin(20, 4);
27.
28.  //Se usa la terminal 6 para manejar el voltaje de la luz de contraste
29.  pinMode(6,OUTPUT);
30.  analogWrite(6,contraste);
31.
32.  //Dejamos que el cursor parpade
33.  LCD.blink();
34.
35.  //Para los botones que regularan el contraste
36.  pinMode(5,INPUT);
37.  pinMode(4,INPUT);
38.}
39.
40.void loop() {
41.  //Si el botón 1 está activado, se sube el contraste aumentando el voltaje
42.  if( estadoBt1 == LOW && digitalRead(4) == HIGH ) {
43.    estadoBt1=HIGH;
44.    contraste++;
45.  } else {
46.    estadoBt1 = LOW;
47.  }
48.
49.  //Si el botón 2 está activado, se baja el contraste reduciendo el voltaje
50.  if( estadoBt2 == LOW && digitalRead(5) == HIGH ) {
51.    estadoBt2 = HIGH;
52.    contraste--;
53.  } else {
54.    estadoBt2 = LOW;
55.  }
56.
57.  //Limpia la pantalla
58.  LCD.clear();
59.
60.  //Ajusta el voltaje para el contraste
61.  analogWrite(6,contraste);
62.
63.  //Se hace el despliegue de los mensajes
64.  LCD.println("Hola mundo!");
65.  LCD.print("Contraste: ");
66.  LCD.print(contraste);
67.
68.  //Un pequeño retardo y seguimos.
69.  delay(150);
70.}


pero mi problema esque quiero usar el control del contraste incorporandolo a otro skecht y no consigo hacerlo sin que de error en el codigo es para el lcd smartie en concreto:

Code: [Select]
// include the library code:
#include <LiquidCrystal.h>

// these constants won't change.  But you can change the size of
// your LCD using them:
const int numRows = 2;
const int numCols = 16;
int estadoBt1 = 0;
int estadoBt2 = 0;
int contraste = 100;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// RS, RW, Enable, 4,5,6,7 (Refer to the back of your LCD for details)


void setup() {
 Serial.begin(9600);
 // set up the LCD's number of rows and columns:
 lcd.begin(numRows, numCols);
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("**Funcionando**");
 lcd.setCursor(0,1);
 lcd.print("Buenas alex...");
 
 //Se usa la terminal 6 para manejar el voltaje de la luz de contraste
 pinMode(6,OUTPUT);
 analogWrite(6,contraste);
//Para los botones que regularan el contraste
 pinMode(9,INPUT);
 pinMode(8,INPUT);
 
 
}

void loop() {
 //Si el botón 1 está activado, se sube el contraste aumentando el voltaje
 if( estadoBt1 == LOW && digitalRead(4) == HIGH ) {
   estadoBt1=HIGH;
   contraste++;
 } else {
   estadoBt1 = LOW;
 }

 //Si el botón 2 está activado, se baja el contraste reduciendo el voltaje
 if( estadoBt2 == LOW && digitalRead(5) == HIGH ) {
   estadoBt2 = HIGH;
   contraste--;
 } else {
   estadoBt2 = LOW;
 }
 
analogWrite(6,contraste);

byte serial_getch(){
 
 int incoming;  
 while (Serial.available()==0){}
     // read the incoming byte:
 incoming = Serial.read();

 return (byte) (incoming &0xff);
}

void loop(){

 byte rxbyte;
 byte temp;

 rxbyte = serial_getch();

 if (rxbyte == 254) //Matrix Orbital uses 254 prefix for commands
 {
   switch (serial_getch())
   {
   case 66: //backlight on (at previously set brightness)
     // not implemented                        

     break;
   case 70: //backlight off
     // not implemented                        
     break;
   case 71:  //set cursor position
     temp = (serial_getch() - 1);  //get column byte
     switch (serial_getch())  //get row byte
     {
       //line 1 is already set up
     case 2:
       temp += 0x40;
       break;
     case 3:
       temp += 0x14;
       break;
     case 4:
       temp += 0x54;
       break;
     default:
       break;
     }
     lcd.command(0b10000000 + temp);
     break;
   case 72:  //cursor home (reset display position)
     lcd.command(2);
     break;
   case 74:  //show underline cursor
     lcd.command(0b00001110);
     break;
   case 75:  //underline cursor off
   case 84:  //block cursor off
     lcd.command(0b00001100);
     break;
   case 76:  //move cursor left
     lcd.command(16);
     break;
   case 77:  //move cursor right
     lcd.command(20);
     break;
   case 78:  //define custom char
     lcd.command(64 + (serial_getch() * 8));  //get+set char address
     for (temp = 7; temp != 0; temp--)
     {
       lcd.print(serial_getch()); //get each pattern byte
     }
     break;
   case 83:  //show blinking block cursor
     lcd.command(0b00001111);
     break;
   case 86:  //GPO OFF
     //implement later
     break;
   case 87:  //GPO ON
     /*temp = serial_getch();
                              if (temp == 1)
                              {
                                    GPO1 = GPO_ON;
                              }*/
     break;
   case 88:  //clear display, cursor home
     lcd.command(1);
     break;
   case 152: //set and remember (doesn't save value, though)
   case 153: //set backlight brightness
     //not implemented
     break;

     //these commands ignored (no parameters)
   case 35: //read serial number
   case 36: //read version number
   case 55: //read module type
   case 59: //exit flow-control mode
   case 65: //auto transmit keypresses
   case 96: //auto-repeat mode off (keypad)
   case 67: //auto line-wrap on
   case 68: //auto line-wrap off
   case 81: //auto scroll on
   case 82: //auto scroll off
   case 104: //init horiz bar graph
   case 109: //init med size digits
   case 115: //init narrow vert bar graph
   case 118: //init wide vert bar graph
     break;
   default:
     //all other commands ignored and parameter byte discarded
     temp = serial_getch();  //dump the command code
     break;
   }
   return;
 } //END OF COMMAND HANDLER

 //change accented char to plain, detect and change descenders
 //NB descenders only work on 5x10 displays. This lookup table works
 //  with my DEM-20845 (Display Elektronik GmbH) LCD using KS0066 chip.
 switch (rxbyte)
 {
   //chars that have direct equivalent in LCD charmap
   /*            case 0x67: //g
                      rxbyte = 0xE7;
                      break;
                case 0x6A: //j
                      rxbyte = 0xEA;
                      break;
                case 0x70: //p
                      rxbyte = 0xF0;
                      break;
                case 0x71: //q
                      rxbyte = 0xF1;
                      break;
                case 0x79: //y
                      rxbyte = 0xF9;
                      break;
    */  case 0xE4: //ASCII "a" umlaut
   rxbyte = 0xE1;
   break;
 case 0xF1: //ASCII "n" tilde
   rxbyte = 0xEE;
   break;
 case 0xF6: //ASCII "o" umlaut
   rxbyte = 0xEF; //was wrong in v0.86
   break;
 case 0xFC: //ASCII "u" umlaut
   rxbyte = 0xF5;
   break;

   //accented -> plain equivalent
   //and misc symbol translation
 case 0xA3: //sterling (pounds)
   rxbyte = 0xED;
   break;
   /*            case 0xB0: //degrees symbol
                      rxbyte = 0xDF;
                      break;
    */  case 0xB5: //mu
   rxbyte = 0xE4;
   break;
 case 0xC0: //"A" variants
 case 0xC1:
 case 0xC2:
 case 0xC3:
 case 0xC4:
 case 0xC5:
   rxbyte = 0x41;
   break;
 case 0xC8: //"E" variants
 case 0xC9:
 case 0xCA:
 case 0xCB:
   rxbyte = 0x45;
   break;
 case 0xCC: //"I" variants
 case 0xCD:
 case 0xCE:
 case 0xCF:
   rxbyte = 0x49;
   break;
 case 0xD1: //"N" tilde -> plain "N"
   rxbyte = 0x43;
   break;
 case 0xD2: //"O" variants
 case 0xD3:
 case 0xD4:
 case 0xD5:
 case 0xD6:
 case 0xD8:
   rxbyte = 0x4F;
   break;
 case 0xD9: //"U" variants
 case 0xDA:
 case 0xDB:
 case 0xDC:
   rxbyte = 0x55;
   break;
 case 0xDD: //"Y" acute -> "Y"
   rxbyte = 0x59;
   break;
   /*            case 0xDF: //beta  //mucks up LCDSmartie's degree symbol??
                      rxbyte = 0xE2;
                      break;
    */  case 0xE0: //"a" variants except umlaut
 case 0xE1:
 case 0xE2:
 case 0xE3:
 case 0xE5:
   rxbyte = 0x61;
   break;
 case 0xE7: //"c" cedilla -> "c"
   rxbyte = 0x63;
   break;
 case 0xE8: //"e" variants
 case 0xE9:
 case 0xEA:
 case 0xEB:
   rxbyte = 0x65;
   break;
 case 0xEC: //"i" variants
 case 0xED:
 case 0xEE:
 case 0xEF:
   rxbyte = 0x69;
   break;
 case 0xF2: //"o" variants except umlaut
 case 0xF3:
 case 0xF4:
 case 0xF5:
 case 0xF8:
   rxbyte = 0x6F;
   break;
 case 0xF7: //division symbol
   rxbyte = 0xFD;
   break;
 case 0xF9: //"u" variants except umlaut
 case 0xFA:
 case 0xFB:
   rxbyte = 0x75;
   break;
 default:
   break;
 }

 lcd.print(rxbyte);  //otherwise a plain char so we print it to lcd
 return;
 

}



entonces hay ya he incorporado el contenido que me interesa al sketch del lcd smartie pero da errores:

lcd_smartie.cpp: In function 'void loop()':
lcd_smartie:55: error: a function-definition is not allowed here before '{' token
lcd_smartie:303: error: expected `}' at end of input

aver si em podeis decir como incorporarlo sin que de errores por que no lo consigo

Go Up