Go Down

Topic: LCD och Ethernet bibliotek (Read 2158 times) previous topic - next topic

Hej

Jag har försökt att programmera ett arduinokort till ett skolprojekt med ethernet shield tillsammans med en LCD. Jag använder arduinokortet UNO
Men så fort jag använder kodraden:
Code: [Select]
Ethernet.begin(mac)
så slutar LCD'n att fungera korrekt. Bokstäverna hamnar på fel ställe och det är inte ens rätt bokstäver. Alla fel uppkommer efter att jag kör den kodraden. Först trodde jag att det berodde på att jag använde samma portar för arduino som ethernet shild'en använder men har testat med kortet MEGA2560 och använt portarna 32 till 52 till LCD för att vara säker att dom inte använder samma portar. Men detta löste inget och samma fel uppstår.

Men om jag kör endast LCD koderna utan att starta funktionen ethOpenURL() eller kommenterar bort if satsen med Ethernet.begin(mac) i sig så fungerar LCD'n perfekt.
Internet uppkopplingen fungerar perfekt hela tiden så länge jag inte kommenterar bort viktig kod i funktionen ethOpenURL()

Har suttit nätter och dagar och försökt lösa detta och googlat som en galning men alla andra som har liknande fel har problem med att dom använder samma portar vilket jag har redan kontrollerat flera gånger att det inte är.


kan det vara biblioteken som krockar?


Hoppas någon kan hjälpa mig!

Tack på förhand

MVH
Björn

hela koden:
Code: [Select]

#include <LiquidCrystal.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <Time.h>

boolean DEBUG = true;
int DebugLys = 13;

int GronLys = 41,RodLys = 43,GulLys = 45;
int rs=33,rw=35,enable=37, d4=47,d5=49,d6=51,d7=53;

LiquidCrystal lcd(rs,rw,enable,d4,d5,d6,d7);

//eth
boolean Internet = false, DHCP = false, FinnsTid = false;
byte mac[] = {  0x90, 0xA2, 0xDA, 0x00, 0x3C, 0x9C };

//UDP:
unsigned int localPort = 8888;
IPAddress timeServer(132, 163, 4, 101);
const int NTP_PACKET_SIZE= 48;
byte packetBuffer[ NTP_PACKET_SIZE];

// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;


void setup() {

if(DEBUG)
serielStart();

if(DEBUG)
Serial.println("Start av seriel");

//tmp LCD:
pinMode(26, OUTPUT);
digitalWrite(26, LOW);
pinMode(28, OUTPUT);
digitalWrite(28, HIGH);
 
pinMode(DebugLys, OUTPUT);
pinMode(GronLys, OUTPUT);
pinMode(RodLys, OUTPUT);
pinMode(GulLys, OUTPUT);

digitalWrite(DebugLys, HIGH);
digitalWrite(GronLys, HIGH);
digitalWrite(RodLys, LOW);
digitalWrite(GulLys, HIGH);


lcdStart(1);

delay(2000);

lcdRensa(3);

ethOpenURL("www.k-edi.se", "k-edi.se", "/projekt/arduino/sms.php");
lcdSkriv("Ansluter.",0,0);

}


void loop() {

if(DEBUG){
digitalWrite(DebugLys, HIGH);
delay(1000);
lcdSkriv("2",0,0);
digitalWrite(DebugLys, LOW);
}
delay(1000);
lcdSkriv("1",0,0);
}

void ethOpenURL(char adrs[], char host[], char mapp[]) {// adrs är addressen
EthernetClient client; // Init Ethernet client library
char mess[] = {'x','x','x','x','x'}; // för att kolla
boolean nyttMess = false; // den blir true när vi hittat "mess:" och ska kolla vilka tecken som kmr därefter.
int tid=0; // används så att inte loopar fortsätter i all oändlighet.
byte tecken=B1; // alla nya hämtade tecken sätts in här
char ctecken=' '; // sen för att jämföra med samma typ sätts det in i ctecken ifrån tecken.

if (Ethernet.begin(mac) == 0) { // Försöker ansluta med DHCP
if(DEBUG)
Serial.println("Misslyckades konfiguerar Ethernet-kortet med DHCP!");
DHCP = false;
} else {
if(DEBUG) {
Serial.print("DHCP gav ip:"); // Visar ip'n vi fick via den seriella porten.
for (byte ipDel = 0; ipDel < 4; ipDel++) {
Serial.print(Ethernet.localIP()[ipDel], DEC);// Visa varje med ett decimalt värde
Serial.print("."); // En punkt mellan varje siffra för att visa som en ip ska visas.
}
Serial.println(" ");
}
DHCP = true;
}
if(DEBUG)
Serial.println("Forsoker oppna hemsida...");
if (client.connect(adrs, 80)) { // Anslut mot KEDI för att få reda på om vi har internet och hämta tid.
if(DEBUG)
Serial.println("Anslutning mot www.k-edi.se lyckades!");
Internet = true;
client.print("GET ");
client.print(mapp);
client.println(" HTTP/1.0"); // Skapa en HTTP-request:
client.print("HOST: ");
client.println(host);
client.println();
} else {
if(DEBUG)
Serial.println("Anslutning mot www.k-edi.se misslyckades!");
Internet = false;
}
if(DEBUG)
Serial.println("Forsoker hamta data efter att ha skickat forfragan.");

while(client.connected() && tid < 500){
delay(10);
tid++;
}
if(DEBUG)
Serial.println("k-edi.se's anslutning stangs!");
if(DEBUG)
Serial.println("Inhamtad data:");
tecken = client.read();
while(tecken!=255) { // 255 är densamma som -1 vilket betyder att det inte finns något mer tecken att hämta.

ctecken = tecken;
if(DEBUG)
Serial.print(ctecken);
for(int i=0;i<5;i++) // Här gör vi så vi kan snurra runt dom tecknena i mess[] och få plats med ett nytt tecken.
mess[i]=mess[i+1];
mess[4]=ctecken; // Här tillsätter vi det nytillkomna tecknet i mess[]
if(!nyttMess && mess[0]=='m' && mess[1]=='e' && mess[2]=='s' && mess[3]=='s' && mess[4]==':' )// här kollar vi om "mess:" hittats
nyttMess = true; // Om vi hittar
if(nyttMess && mess[3]=='\\' && ctecken=='n'){
if(DEBUG)
Serial.println("Fungerar");
}
tecken = client.read();
}
if(DEBUG)
Serial.println(""); // Stänger anslutningen mot servern
return ;
}

void lcdRensa(int nr) { // Rensar en vis rad
if(nr==0 || nr==1){
lcdSkriv("                ",nr,0);
} else {
lcd.clear();
}
return;
}

// Funktion för start av seriel överföring för debugging
void serielStart() {
int TmpTid = 0;
Serial.begin(9600);
while (!Serial && TmpTid>10) {
delay(100);
TmpTid++;
}
return;
}

// Funktion för stop av seriel överföring för debugging
void serielStop() {
int TmpTid = 0;
Serial.begin(9600); // Skapa förbindelse
while (!Serial && TmpTid>10) { // vänta tills förbindelse är skapad
delay(100);
TmpTid++;
}
return;
}


void lcdStart(int nr) {
if(DEBUG)
Serial.println("LCD init");

byte a_[8],aa_[8],o_[8]; // variabler för att skapa å,ä,ö
a_[0] = B00100; // här ges bitarna ut för bokstaven 'å'
a_[1] = B00000;
a_[2] = B01110;
a_[3] = B00001;
a_[4] = B01111;
a_[5] = B10001;
a_[6] = B01111;
a_[7] = B00000;
aa_[0] = B01010; // här ges bitarna ut för bokstaven 'ä'
aa_[1] = B00000;
aa_[2] = B01110;
aa_[3] = B00001;
aa_[4] = B01111;
aa_[5] = B10001;
aa_[6] = B01111;
aa_[7] = B00000;
o_[0] = B00000; // här ges bitarna ut för bokstaven 'ö'
o_[1] = B01010;
o_[2] = B00000;
o_[3] = B01110;
o_[4] = B10001;
o_[5] = B10001;
o_[6] = B01110;
o_[7] = B00000;

lcd.begin(16, 2);                        //  16 tecken och 2 rader och kickar igång den.

lcd.createChar(1,a_); // Här skapar vi tecknet å för LCD'n
lcd.createChar(2,aa_); // Här skapar vi tecknet ä för LCD'n
lcd.createChar(3,o_); // Här skapar vi tecknet ö för LCD'n

if(DEBUG && nr)
Serial.println("LCD valkomst medelande.");

if(nr){
lcdSkriv("Välkommen!",0,0);

lcdSkriv("Ver 1.0",0,1);
}
return;
}

void lcdSkriv(char tmp[],int kol, int rad) {
int tmp_size=0;
for(int i=0;tmp[i];i++)
tmp_size++;

lcd.setCursor(kol, rad);


for(int i=0; i < tmp_size; i++) {

if(-61==tmp[i] && -91==tmp[i+1]){
  tmp[i]=1;
  for(int i2=i+1; i2 < tmp_size; i2++)
tmp[i2]=tmp[i2+1];
  tmp_size--;
}
if(-61==tmp[i] && -92==tmp[i+1]){
tmp[i]=2;
for(int i2=i+1; i2 < tmp_size; i2++)
tmp[i2]=tmp[i2+1];
tmp_size--;
}
if(-61==tmp[i] && -74==tmp[i+1]){
  tmp[i]=3;
  for(int i2=i+1; i2 < tmp_size; i2++)
tmp[i2]=tmp[i2+1];
  tmp_size--;
}
}
lcd.print(tmp);

return;
}

// ************************************
// Koden nedan är från xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// ************************************

// send an NTP request to the time server at the given address
unsigned long sendNTPpacket(IPAddress& address)
{
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;

  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:    
  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer,NTP_PACKET_SIZE);
  Udp.endPacket();
}



perhof


Code: [Select]

int rs=33,rw=35,enable=37, d4=47,d5=49,d6=51,d7=53;

LiquidCrystal lcd(rs,rw,enable,d4,d5,d6,d7);



Du säger att du använt port 32 till 52. Vad betyder det?

I exemplet som du postar använder du d51 och d53 till din LCD men dessa används för SPI av din ethernet shield.
Den använder pin 4, 50, 51, 52, 53 på en Mega 2560 och pin 4, 10, 11, 12, 13 på UNO.
Är du säker på att du hållit dig borta från alla de pinnarna?

perhof


Den använder pin 4, 50, 51, 52, 53 på en Mega 2560 och pin 4, 10, 11, 12, 13 på UNO.


Korrigering:
Shielden använder pin 4, 10, 50, 51, 52 på en Mega 2560 och pin 4, 10, 11, 12, 13 på UNO.
Dessutom finns det restriktioner för pin 53 på Mega 2560 eftersom den också används av SPI.

Från:
http://arduino.cc/en/Main/ArduinoEthernetShield

Quote

Arduino communicates with both the W5100 and SD card using the SPI bus (through the ICSP header). This is on digital pins 11, 12, and 13 on the Duemilanove and pins 50, 51, and 52 on the Mega. On both boards, pin 10 is used to select the W5100 and pin 4 for the SD card. These pins cannot be used for general i/o. On the Mega, the hardware SS pin, 53, is not used to select either the W5100 or the SD card, but it must be kept as an output or the SPI interface won't work.


Det finns många pins som har dubbla uppgifter så alla kan inte användas till allt (se http://arduino.cc/en/Hacking/PinMapping2560 ) men det låter på din beskrivning som att du trots allt har kollision mellan LCD-pinnarna och SPI.


Tack "perhof"!!!!!!!

Jag trodde ethernet-kortet använde samma portar eftersom det satt på ungefär samma sätt som på UNO kortet som på MEGA men hade fel...
Nu fungerar allt perfekt utan konstiga fel!
Du sparade mig så himla mycket tid!!

Ett jätte tack igen!!

MVH
Björn

Go Up