My program size is 12,550 bytes of the 14,336 maximum for a pro mini 168. It uploads fine but either prints garbage to the lcd or nothing at all. When i cut the program size to about 10,700 bytes by removing the Onewire Library, the sketch works fine. I had the same sketch running on a 328 with no problems. If it is an issue of program size, why would I be able to upload it in the first place? Any suggestions to shrink the size?
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
#include <OneWire.h>
#define rxpin 12
#define txpin 11
SoftwareSerial mySerial(rxpin, txpin);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
const int numReadings = 3;
const int sensorPin = A5;
const int pumpPin = 9;
const int ledPin1 = 8;
const int ledPin2 = 13;
const int sensorMin = 0; // sensor minimum, discovered through experiment
const int sensorMax = 1023;
const unsigned int MAX_INPUT = 50;
float readings[numReadings]; // the readings from the analog input
int index = 0; // the index of the current reading
float total = 0; // the running total
float average = 0;
int sensorValue = 0;
int DS18S20_Pin = 10;
float pHtarget = 5.8;
float pHhigh = pHtarget + .05;
float pHlow = pHtarget - .05;
float phValue = 0;
OneWire ds(DS18S20_Pin);
void setup()
{
lcd.begin(16, 2);
lcd.print ("pH start");
delay(200);
Serial.begin(38400);
mySerial.begin(38400);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(13, OUTPUT);
//getTemp();
for (int thisReading = 0; thisReading < numReadings; thisReading++)
readings[thisReading] = 0;
}
void process_average (float average)
{
lcd.clear();
Serial.println(average);
lcd.print ("pH value:");
lcd.setCursor(12, 0); // top right
lcd.print(average);
Serial.println ("phValue");
if (average > pHhigh)
{
lcd.setCursor(0, 0); // top left
lcd.print("ph adjust:");
lcd.setCursor(0, 1); // bottom left
lcd.print("Too High");
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin1, HIGH);
digitalWrite(pumpPin, HIGH);
delay(150);
digitalWrite(pumpPin, LOW);
digitalWrite(ledPin1, LOW);
delay(10000);
lcd.clear();
}
else if (average < pHlow)
{
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin1, HIGH);
lcd.setCursor(0, 1); // bottom left
lcd.print("Too Low");
delay (400);
lcd.clear();
}
else
{
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin1, LOW);
Serial.println(average);
delay(400);
lcd.clear();
}
}
void loop(){
total= total - readings[index]; // subtract the last reading:
mySerial.print("r");
mySerial.print('\r');
delay (500);
readings[index] = getPH (); // read from the sensor:
total= total + readings[index]; // add the reading to the total:
index = index + 1; // advance to the next position in the array:
if (index >= numReadings) // if we're at the end of the array...
index = 0; // ...wrap around to the beginning:
average = total / numReadings; // calculate the average:
process_average (average); // send it to the computer as ASCII digit
sensorValue = analogRead(sensorPin);
Serial.println(sensorValue);
int range = map(sensorValue, sensorMin, sensorMax, 0, 9);
delay(500);
switch (range) {
case 0: //0-102
break;
case 1: // 54k ohm - 175
mySerial.print("r");
mySerial.print('\r');
lcd.print("Reading Probe...");
delay(500);
lcd.clear();
break;
case 2: // 205-306
break;
case 3: // 307-409 18.5k ohm 378
lcd.print("Calibration:");
lcd.setCursor(0,2);
lcd.print("SEVEN-equalizing");
mySerial.print("c");
mySerial.print('\r');
delay (60000);
lcd.clear();
mySerial.print("s");
mySerial.print('\r');
lcd.print("Cal. SEVEN");
delay(500);
lcd.clear();
lcd.print("Switch Buffers");
delay(10000);
lcd.clear();
lcd.print("Calibration:");
lcd.setCursor(0,2);
lcd.print("FOUR-equalizing");
delay (60000);
mySerial.print("f");
mySerial.print('\r');
lcd.print("Cal. FOUR");
delay(500);
lcd.clear();
lcd.print("Calibration:");
lcd.setCursor(0,2);
lcd.print("COMPLETE");
delay(500);
lcd.clear();
mySerial.print("e");
mySerial.print('\r');
break;
case 4: // 410-511
break;
case 5: // 512-613 8.5k ohm 579
mySerial.print("e");
mySerial.print('\r');
lcd.print("exit");
delay(500);
lcd.clear();
break;
case 6: // 614-716 5.5k ohm 682
break;
case 7: // 717-818 3k ohm 807
break;
case 8: // 819-920 1.2k ohm 913
break; // end of case 8
case 9: // 921-1023 0 ohm
break;
}
}// end of main loop
float getPH ()
{
static char input_line [MAX_INPUT];
static unsigned int input_pos = 0;
while (mySerial.available () > 0)
{
char inByte = mySerial.read ();
switch (inByte)
{
case '\r': // end of text
{
input_line [input_pos] = 0; // terminating null byte
char * val (input_line);
input_pos = 0;// reset buffer for next time
Serial.println ( val);
float phValue = atof(val);
return phValue;
break;
}
case '\n': // discard carriage return
break;
default:
// keep adding if not full ... allow for terminating null byte
if (input_pos < (MAX_INPUT - 1))
input_line [input_pos++] = inByte;
break;
} // end of switch
} // end of incoming data
} // end of function
float getTemp()//returns the temperature from one DS18S20 in DEG Celsius
{
byte data[12];
byte addr[8];
if ( !ds.search(addr)) //no more sensors on chain, reset search
{
ds.reset_search();
return -1000;
}
if ( OneWire::crc8( addr, 7) != addr[7])
{
Serial.print("CRC is not valid!\n");
return -1000;
}
if ( addr[0] != 0x10 && addr[0] != 0x28)
{
Serial.print("Device is not recognized");
return -1000;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end
byte present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for (int i = 0; i < 9; i++)
{ // we need 9 bytes
data[i] = ds.read();
}
ds.reset_search();
byte MSB = data[1];
byte LSB = data[0];
float tempRead = ((MSB << 8) | LSB); //using two's compliment
float TemperatureSum = tempRead / 16;
mySerial.print (TemperatureSum);
float temp_F = TemperatureSum * 9 / 5 + 32;
lcd.print ("Temp Reading:");
lcd.setCursor(0, 1); // bottom lef
lcd.print (temp_F);
delay (750);
lcd.clear();
}