Created
April 21, 2014 00:23
-
-
Save rezahussain/11128896 to your computer and use it in GitHub Desktop.
Dormant Labs LCD PH Module V2 Arduino
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <Wire.h> | |
#include <stdlib.h> | |
#define PHADDRESS 0x4D | |
int RoomTempI2CAddress = B1001011; | |
float volt4 = 0.95; | |
float volt7 = 0.67; | |
float calibrationTempC = 20; | |
#define OLED_address 0x3c | |
unsigned char fill_OLED=0x55; | |
//======================== | |
unsigned char myFont[][8]={ | |
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, | |
{0x00,0x00,0x5F,0x00,0x00,0x00,0x00,0x00}, | |
{0x00,0x00,0x07,0x00,0x07,0x00,0x00,0x00}, | |
{0x00,0x14,0x7F,0x14,0x7F,0x14,0x00,0x00}, | |
{0x00,0x24,0x2A,0x7F,0x2A,0x12,0x00,0x00}, | |
{0x00,0x23,0x13,0x08,0x64,0x62,0x00,0x00}, | |
{0x00,0x36,0x49,0x55,0x22,0x50,0x00,0x00}, | |
{0x00,0x00,0x05,0x03,0x00,0x00,0x00,0x00}, | |
{0x00,0x1C,0x22,0x41,0x00,0x00,0x00,0x00}, | |
{0x00,0x41,0x22,0x1C,0x00,0x00,0x00,0x00}, | |
{0x00,0x08,0x2A,0x1C,0x2A,0x08,0x00,0x00}, | |
{0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00}, | |
{0x00,0xA0,0x60,0x00,0x00,0x00,0x00,0x00}, | |
{0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x00}, | |
{0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00}, | |
{0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00}, | |
{0x00,0x3E,0x51,0x49,0x45,0x3E,0x00,0x00}, | |
{0x00,0x00,0x42,0x7F,0x40,0x00,0x00,0x00}, | |
{0x00,0x62,0x51,0x49,0x49,0x46,0x00,0x00}, | |
{0x00,0x22,0x41,0x49,0x49,0x36,0x00,0x00}, | |
{0x00,0x18,0x14,0x12,0x7F,0x10,0x00,0x00}, | |
{0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00}, | |
{0x00,0x3C,0x4A,0x49,0x49,0x30,0x00,0x00}, | |
{0x00,0x01,0x71,0x09,0x05,0x03,0x00,0x00}, | |
{0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00}, | |
{0x00,0x06,0x49,0x49,0x29,0x1E,0x00,0x00}, | |
{0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00}, | |
{0x00,0x00,0xAC,0x6C,0x00,0x00,0x00,0x00}, | |
{0x00,0x08,0x14,0x22,0x41,0x00,0x00,0x00}, | |
{0x00,0x14,0x14,0x14,0x14,0x14,0x00,0x00}, | |
{0x00,0x41,0x22,0x14,0x08,0x00,0x00,0x00}, | |
{0x00,0x02,0x01,0x51,0x09,0x06,0x00,0x00}, | |
{0x00,0x32,0x49,0x79,0x41,0x3E,0x00,0x00}, | |
{0x00,0x7E,0x09,0x09,0x09,0x7E,0x00,0x00}, | |
{0x00,0x7F,0x49,0x49,0x49,0x36,0x00,0x00}, | |
{0x00,0x3E,0x41,0x41,0x41,0x22,0x00,0x00}, | |
{0x00,0x7F,0x41,0x41,0x22,0x1C,0x00,0x00}, | |
{0x00,0x7F,0x49,0x49,0x49,0x41,0x00,0x00}, | |
{0x00,0x7F,0x09,0x09,0x09,0x01,0x00,0x00}, | |
{0x00,0x3E,0x41,0x41,0x51,0x72,0x00,0x00}, | |
{0x00,0x7F,0x08,0x08,0x08,0x7F,0x00,0x00}, | |
{0x00,0x41,0x7F,0x41,0x00,0x00,0x00,0x00}, | |
{0x00,0x20,0x40,0x41,0x3F,0x01,0x00,0x00}, | |
{0x00,0x7F,0x08,0x14,0x22,0x41,0x00,0x00}, | |
{0x00,0x7F,0x40,0x40,0x40,0x40,0x00,0x00}, | |
{0x00,0x7F,0x02,0x0C,0x02,0x7F,0x00,0x00}, | |
{0x00,0x7F,0x04,0x08,0x10,0x7F,0x00,0x00}, | |
{0x00,0x3E,0x41,0x41,0x41,0x3E,0x00,0x00}, | |
{0x00,0x7F,0x09,0x09,0x09,0x06,0x00,0x00}, | |
{0x00,0x3E,0x41,0x51,0x21,0x5E,0x00,0x00}, | |
{0x00,0x7F,0x09,0x19,0x29,0x46,0x00,0x00}, | |
{0x00,0x26,0x49,0x49,0x49,0x32,0x00,0x00}, | |
{0x00,0x01,0x01,0x7F,0x01,0x01,0x00,0x00}, | |
{0x00,0x3F,0x40,0x40,0x40,0x3F,0x00,0x00}, | |
{0x00,0x1F,0x20,0x40,0x20,0x1F,0x00,0x00}, | |
{0x00,0x3F,0x40,0x38,0x40,0x3F,0x00,0x00}, | |
{0x00,0x63,0x14,0x08,0x14,0x63,0x00,0x00}, | |
{0x00,0x03,0x04,0x78,0x04,0x03,0x00,0x00}, | |
{0x00,0x61,0x51,0x49,0x45,0x43,0x00,0x00}, | |
{0x00,0x7F,0x41,0x41,0x00,0x00,0x00,0x00}, | |
{0x00,0x02,0x04,0x08,0x10,0x20,0x00,0x00}, | |
{0x00,0x41,0x41,0x7F,0x00,0x00,0x00,0x00}, | |
{0x00,0x04,0x02,0x01,0x02,0x04,0x00,0x00}, | |
{0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00}, | |
{0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x00}, | |
{0x00,0x20,0x54,0x54,0x54,0x78,0x00,0x00}, | |
{0x00,0x7F,0x48,0x44,0x44,0x38,0x00,0x00}, | |
{0x00,0x38,0x44,0x44,0x28,0x00,0x00,0x00}, | |
{0x00,0x38,0x44,0x44,0x48,0x7F,0x00,0x00}, | |
{0x00,0x38,0x54,0x54,0x54,0x18,0x00,0x00}, | |
{0x00,0x08,0x7E,0x09,0x02,0x00,0x00,0x00}, | |
{0x00,0x18,0xA4,0xA4,0xA4,0x7C,0x00,0x00}, | |
{0x00,0x7F,0x08,0x04,0x04,0x78,0x00,0x00}, | |
{0x00,0x00,0x7D,0x00,0x00,0x00,0x00,0x00}, | |
{0x00,0x80,0x84,0x7D,0x00,0x00,0x00,0x00}, | |
{0x00,0x7F,0x10,0x28,0x44,0x00,0x00,0x00}, | |
{0x00,0x41,0x7F,0x40,0x00,0x00,0x00,0x00}, | |
{0x00,0x7C,0x04,0x18,0x04,0x78,0x00,0x00}, | |
{0x00,0x7C,0x08,0x04,0x7C,0x00,0x00,0x00}, | |
{0x00,0x38,0x44,0x44,0x38,0x00,0x00,0x00}, | |
{0x00,0xFC,0x24,0x24,0x18,0x00,0x00,0x00}, | |
{0x00,0x18,0x24,0x24,0xFC,0x00,0x00,0x00}, | |
{0x00,0x00,0x7C,0x08,0x04,0x00,0x00,0x00}, | |
{0x00,0x48,0x54,0x54,0x24,0x00,0x00,0x00}, | |
{0x00,0x04,0x7F,0x44,0x00,0x00,0x00,0x00}, | |
{0x00,0x3C,0x40,0x40,0x7C,0x00,0x00,0x00}, | |
{0x00,0x1C,0x20,0x40,0x20,0x1C,0x00,0x00}, | |
{0x00,0x3C,0x40,0x30,0x40,0x3C,0x00,0x00}, | |
{0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00}, | |
{0x00,0x1C,0xA0,0xA0,0x7C,0x00,0x00,0x00}, | |
{0x00,0x44,0x64,0x54,0x4C,0x44,0x00,0x00}, | |
{0x00,0x08,0x36,0x41,0x00,0x00,0x00,0x00}, | |
{0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00}, | |
{0x00,0x41,0x36,0x08,0x00,0x00,0x00,0x00}, | |
{0x00,0x02,0x01,0x01,0x02,0x01,0x00,0x00}, | |
{0x00,0x02,0x05,0x05,0x02,0x00,0x00,0x00} | |
}; | |
//extern unsigned char myFont[][8]; | |
//extern unsigned char logo[]; | |
extern unsigned char ip[]; | |
//==========================================================// | |
void print_a_char(unsigned char ascii=0) | |
{ | |
unsigned char i=0; | |
for(i=0;i<8;i++) | |
{ | |
SendChar(myFont[ascii-0x20][i]); | |
} | |
} | |
//==========================================================// | |
void setup() | |
{ | |
} | |
//==========================================================// | |
void loop() | |
{ | |
Wire.begin(); | |
init_OLED(); | |
delay(10); | |
clear_display(); | |
delay(50); | |
Serial.begin(9600); | |
SetRoomTemperataureResolutionBits(12);//12 bits room temp resolution in celcius | |
int sampleSize = 500; | |
double avgMeasuredPH = 0; | |
double avgRoomTempC = 0; | |
double avgPHVolts = 0; | |
double tempAdjusted4; | |
int x; | |
for(x=0;x< sampleSize;x++) | |
{ | |
double phVolt = getPHVolts(); | |
tempAdjusted4 = adjustPHBasedOnTemp(4,calibrationTempC); | |
double voltsPerPH = (abs(volt7-volt4)) / (7-tempAdjusted4); | |
double realPHVolt = (volt7 - phVolt); | |
double phUnits = realPHVolt / voltsPerPH; | |
double measuredPH = 7 + phUnits; | |
double roomTempC = getRoomTemperatureC(); | |
avgMeasuredPH+=measuredPH; | |
avgRoomTempC+=roomTempC; | |
avgPHVolts += phVolt; | |
} | |
avgMeasuredPH/=sampleSize; | |
avgRoomTempC/=sampleSize; | |
avgPHVolts/=sampleSize; | |
clear_display(); | |
delay(50); | |
sendcommand(0x20); //Set Memory Addressing Mode | |
sendcommand(0x02); //Set Memory Addressing Mode ab Page addressing mode(RESET) | |
sendcommand(0xa6); //Set Normal Display (default) | |
//====================SHOW FONTS ARRAY[1-4]=======================// | |
char buffer[10]; | |
setXY(0,0); | |
sendStr((unsigned char*)"avgPH="); | |
setXY(0,6); | |
dtostrf(avgMeasuredPH,4,2,buffer); | |
sendStr((unsigned char*)buffer); | |
avgMeasuredPH = adjustPHBasedOnTemp(avgMeasuredPH,avgRoomTempC); | |
setXY(1,0); | |
sendStr((unsigned char*)"AdjPH="); | |
setXY(1,6); | |
dtostrf(avgMeasuredPH,4,2,buffer); | |
sendStr((unsigned char*)buffer); | |
setXY(2,0); | |
sendStr((unsigned char*)"TempC="); | |
setXY(2,6); | |
dtostrf(avgRoomTempC,4,2,buffer); | |
sendStr((unsigned char*)buffer); | |
setXY(3,0); | |
sendStr((unsigned char*)"phVolts="); | |
setXY(3,8); | |
dtostrf(avgPHVolts,4,2,buffer); | |
sendStr((unsigned char*)buffer); | |
/* | |
Serial.print("avgMeasuredPH-"); | |
Serial.print("avgMeasuredPH-"); | |
Serial.print(avgMeasuredPH,4); | |
//Serial.print(" roomTempMeasuredPH-"); | |
//Serial.print(avgRoomTempMeasuredPH,4); | |
Serial.print(" avgRoomtTempC-"); | |
Serial.print(avgRoomTempC,4); | |
Serial.print(" avgPhVolts-"); | |
Serial.print(avgPHVolts,4); | |
Serial.print(" 7CalVolts-"); | |
Serial.print(volt7,4); | |
Serial.print(" 4CalVolts-"); | |
Serial.print(volt4,4); | |
Serial.print(" 4CalTempAdjusted-"); | |
Serial.println(tempAdjusted4,4); | |
*/ | |
/* | |
setXY(2,3); | |
sendStr(fill_string1); | |
setXY(3,3); | |
sendStr(fill_string2); | |
setXY(4,3); | |
sendStr(fill_string3); | |
setXY(5,3); | |
sendStr(fill_string4);*/ | |
delay(1000); | |
} | |
//==========================================================// | |
void sendcommand(unsigned char com) | |
{ | |
Wire.beginTransmission(OLED_address); //begin transmitting | |
Wire.write(0x80); //command mode | |
Wire.write(com); | |
Wire.endTransmission(); // stop transmitting | |
} | |
//==========================================================// | |
void clear_display(void) | |
{ | |
unsigned char i,k; | |
for(k=0;k<8;k++) | |
{ | |
setXY(k,0); | |
{ | |
for(i=0;i<128;i++) //clear all COL | |
{ | |
SendChar(0); //clear all COL | |
//delay(10); | |
} | |
} | |
} | |
} | |
//==========================================================// | |
void SendChar(unsigned char data) | |
{ | |
Wire.beginTransmission(OLED_address); // begin transmitting | |
Wire.write(0x40);//data mode | |
Wire.write(data); | |
Wire.endTransmission(); // stop transmitting | |
} | |
//==========================================================// | |
void setXY(unsigned char row,unsigned char col) | |
{ | |
sendcommand(0xb0+row); //set page address | |
sendcommand(0x00+(8*col&0x0f)); //set low col address | |
sendcommand(0x10+((8*col>>4)&0x0f)); //set high col address | |
} | |
//==========================================================// | |
void sendStr(unsigned char *string) | |
{ | |
unsigned char i=0; | |
//setXY(0,0); | |
while(*string) | |
{ | |
for(i=0;i<8;i++) | |
{ | |
SendChar(myFont[*string-0x20][i]); | |
// SendChar(*string); | |
delay(10); | |
} | |
*string++; | |
} | |
} | |
//==========================================================// | |
void init_OLED(void) | |
{ | |
sendcommand(0xae); //display off | |
delay(50); | |
//----------------------------REVERSE comments----------------------------// | |
// sendcommand(0xa0); //seg re-map 0->127(default) | |
// sendcommand(0xa1); //seg re-map 127->0 | |
// sendcommand(0xc8); | |
// delay(1000); | |
//----------------------------REVERSE comments----------------------------// | |
sendcommand(0xaf); //display on | |
delay(50); | |
} | |
float adjustPHBasedOnTemp(float PH, float temp) | |
{ | |
float difference = temp-25; | |
float phAdjust = (0.009 * difference); | |
float tempAdjustedPH = PH + phAdjust; | |
return tempAdjustedPH; | |
} | |
double getPHVolts() | |
{ | |
byte ad_high; | |
byte ad_low; | |
Wire.requestFrom(PHADDRESS, 2); //requests 2 bytes | |
while(Wire.available() < 2); //while two bytes to receive | |
ad_high = Wire.read(); | |
ad_low = Wire.read(); | |
double units = (ad_high * 256) + ad_low; | |
double volts = (units /4096)*3; | |
return volts; | |
} | |
double getRoomTemperatureC() | |
{ | |
Wire.requestFrom(RoomTempI2CAddress,2); | |
byte MSB = Wire.read(); | |
byte LSB = Wire.read(); | |
int TemperatureSum = ((MSB << 8) | LSB) >> 4; | |
double celsius = TemperatureSum*0.0625; | |
return celsius; | |
} | |
void SetRoomTemperataureResolutionBits(int ResolutionBits) | |
{ | |
if (ResolutionBits < 9 || ResolutionBits > 12) exit; | |
Wire.beginTransmission(RoomTempI2CAddress); | |
Wire.write(B00000001); //addresses the configuration register | |
Wire.write((ResolutionBits-9) << 5); //writes the resolution bits | |
Wire.endTransmission(); | |
Wire.beginTransmission(RoomTempI2CAddress); //resets to reading the temperature | |
Wire.write((byte)0x00); | |
Wire.endTransmission(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment