Arduino Serial Lcd and Irc?
From
Goal:
learning what it takes to communicate between a pc/laptop and a arduino or simmilar device
python code in python2.x
python code:
#author Duality import serial import socket import sys ser = serial.Serial(str(raw_input("enter device for example: /dev/xx: ")), int(raw_input("and baud: "))) server = "irc.freenode.net" channel = raw_input("Enter channel: ") #channel = "#test1123" nick = "ArduDuaDisp" ircsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ircDone = False def ping(): ircsock.send("PONG :Pong\n") def sendmsg(chan, msg): ircsock.send("PRIVMSG "+chan+" :"+msg+"\n") def joinchan(chan): ircsock.send("JOIN "+chan+"\n") def connectIrc(): ircsock.connect((server, 6667)) ircsock.send("USER "+nick+" "+nick+" "+nick+" :Arduino Irc Thingy\n") ircsock.send("NICK "+nick+"\n") joinchan(channel) def irc(): ircmsg = ircsock.recv(2048) ircmsg = ircmsg.strip('\n\r') ircmsg = str(ircmsg).lower() if ircmsg.find("ping :") != -1: ping() print nick+" >> "+ircmsg if ircmsg.find("privmsg") != -1: return ircmsg connectIrc() while True: disp = irc() if disp != None: disp = disp.split(' ') for l in xrange(len(disp)): if disp[l] == "privmsg": disp = disp[l:len(disp)][2:] disp = ' '.join(disp) disp = disp[1:] break print ">> displayed >>: ",disp ser.write(str(disp))
arduino code:
/* author: Duality */ #include <IOlcd.h> #include <Wire.h> IOlcd lcd; int x; int y; void setup(){ Serial.begin(115200); if(lcd.init(0x20, MCP23016)){ Serial.println("Communication with IOlcd works!"); } else{ Serial.println("Not connected propperly!"); } lcd.begin(16,2); lcd.clear(); } void loop(){ if(Serial.available()){ delay(1000); lcd.clear(); x=0; y=0; while(Serial.available() > 0){ if(x == 16){ x=0; y=1; } else if(x == 16 && y == 1){ lcd.clear(); lcd.home(); x=0; y=0; } lcd.setCursor(x,y); Serial.print(x); Serial.println(" "); lcd.write(Serial.read()); x++; } } }
adjusted the code for longer lines, which made it more complicated :) and more fun...
/* author: Duality */ #include <IOlcd.h> #include <Wire.h> IOlcd lcd; int buffSize = 64; char screenBuf[65]; int arrayIndex = 0; long previousMillis = 0; long interval = 1000; int state = 1; void setup(){ Serial.begin(115200); if(lcd.init(0x20, MCP23016)){ Serial.println("Communication with the IOlcd works!"); } else{ Serial.println("Not connected propperly!"); } lcd.begin(16,2); lcd.clear(); flushBuffer(); } void loop(){ unsigned long currentMillis= millis(); pinMode(13, OUTPUT); if(Serial.available()!=0){ arrayIndex = 0; flushBuffer(); while(Serial.available() != 0){ delay(20); screenBuf[arrayIndex] = Serial.read(); arrayIndex++; if(arrayIndex == buffSize){ break; } } } else if(currentMillis - previousMillis > interval){ previousMillis = currentMillis; //Serial.println("numelements: \n\r"); //Serial.println(countElements()); //Serial.println("currentMillis: \n\r"); //Serial.println(currentMillis); //Serial.println("What is in screen buffer: \n\r"); //Serial.println(screenBuf); printToLcd(); } } void printToLcd(){ int numElements = countElements(); if(numElements >32){ //Serial.println("the state: "); //Serial.println(state); state = switchLines(); //digitalWrite(13, state); toggleLines(state); } else{ singleLineDisp(); } } void singleLineDisp(void){ for(int i=0;i<32;i++){ if(i>=16 && screenBuf[i]!='\0'){ lcd.setCursor((i-16), 1); lcd.print(screenBuf[i]); } else if(screenBuf[i]!='\0'){ lcd.setCursor(i,0); lcd.print(screenBuf[i]); } } } void toggleLines(int _state){ lcd.clear(); if(state == 1){ singleLineDisp(); } else if(state == 0){ for(int i=32;i<64;i++){ if(i>=48 && screenBuf[i]!='\0'){ lcd.setCursor((i-48), 1); lcd.print(screenBuf[i]); } else if(screenBuf[i]!='\0'){ lcd.setCursor((i-32), 0); lcd.print(screenBuf[i]); } } } } int switchLines(){ if(state == 1){ state = 0; } else{ state = 1; } return state; } int countElements(void){ int count = 0; for(int i = 0;i<buffSize;i++){ if(screenBuf[i] != '\0'){ count ++; } } return count; } void flushBuffer(void){ for(int i = 0;i<buffSize;i++){ screenBuf[i] = '\0'; } lcd.clear(); }
little update latest code/sketch:
/* author: Duality */ #include <IOlcd.h> #include <Wire.h> IOlcd lcd; int buffSize = 256; char screenBuf[257]; int arrayIndex = 0; long previousMillis = 0; long interval = 1500; int first = 0; int lineLen = 32; void setup(){ pinMode(13, OUTPUT); Serial.begin(115200); if(lcd.init(0x20, MCP23016)){ Serial.println("Communication with the IOlcd works!"); } else{ Serial.println("Not connected propperly!"); } lcd.begin(16,2); lcd.clear(); flushBuffer(); } void loop(){ unsigned long currentMillis = millis(); if(Serial.available()!=0){ arrayIndex = 0; flushBuffer(); while(Serial.available() != 0){ delay(20); screenBuf[arrayIndex] = Serial.read(); arrayIndex++; if(arrayIndex == buffSize){ arrayIndex = 0; } } } else if(currentMillis - previousMillis > interval){ previousMillis = currentMillis; printScreen(); } } void printScreen(){ int numElements = countElements(); if(first == buffSize || first >= numElements){ first = 0; } else{ lineDisp(first, lineLen); first += 32; } } void lineDisp(int startline ,int lineSize){ for(int i = startline;i<(startline+lineSize);i++){ if(i>=(startline+lineSize-16)&&screenBuf[i]=='\0'){ lcd.setCursor((i-(startline+lineSize-16)),1); lcd.print(" "); } else if(screenBuf[i]=='\0'){ lcd.setCursor((i-startline),0); lcd.print(" "); } if(i>=(startline+lineSize-16)&&screenBuf[i]!='\0'){ lcd.setCursor((i-(startline+lineSize-16)),1); lcd.print(screenBuf[i]); } else if(screenBuf[i]!='\0'){ lcd.setCursor((i-startline),0); lcd.print(screenBuf[i]); } } } int countElements(void){ int count = 0; for(int i = 0;i<buffSize;i++){ if(screenBuf[i] != '\0'){ count ++; } } return count; } void flushBuffer(void){ for(int i = 0;i<buffSize+1;i++){ screenBuf[i] = '\0'; } lcd.clear(); }