The program worked perfect until that exact line. It displayed everything it should have. It would just stop at that display.display();.
For whatever reason, it only stalled if display.display() was called, while the pump was running.
I ended up "fixing" the problem by reworking the code so they wouldn't run at the same time.
#include <Wire.h>
#include <Adafruit_SSD1306.h>
//#include <Adafruit_GFX.h>
Adafruit_SSD1306 display(-1);
const unsigned char rainDrop[] PROGMEM = {0x00, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x1e, 0x00, 0x3f, 0x00, 0x7f, 0x80, 0x7f, 0xc0, 0xff, 0xc0, 0xbf, 0xc0, 0xbf, 0xc0, 0xdf, 0xc0, 0xdf, 0x80, 0x7f, 0x80, 0x1f, 0x00};
void makeRain(int delayTime, int width = 128, int height = 62){
long StartTime = millis();
int rwidth = 10;
int rheight = 15;
int totalLines = height / rheight;
int line = 1;
int ind;
while((delayTime*1000) > (millis() - StartTime)){
display.clearDisplay();
for(int ii = 0; ii<totalLines; ii+=1){
ind = 0;
if(line % 2 == 0){ind = (rwidth/2);}
line+=1;
for(int i = 0; i<width; i+= (rwidth+3)){
display.drawBitmap(i+ind, (ii*rheight), rainDrop, rwidth, rheight, WHITE);
}
}
line+=1;
display.display();
}
}
void splashScreen(){
display.clearDisplay();
display.setCursor(0,0);
// display.drawBitmap(0, 0, titleScreen, 128, 32, WHITE); #I took this out for the post
display.display();
}
void homeScreen(int p1, int p2, int p3, int p4){
if(p1 < 0 || p2 < 0 || p3 < 0 || p4 < 0){
makeRain(2.5);
}
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0,0);
display.println("Soil Stats");
display.setTextSize(1);
display.setCursor(0,17);
display.print(F("Pot1:"));
display.setCursor(60,17);
display.print(F("Pot2:"));
display.setCursor(0,25);
display.print(F("Pot3:"));
display.setCursor(60,25);
display.print(F("Pot4:"));
if(p1>=0){
display.setCursor(30,17);
display.print(p1);
display.print(F("%"));
}else{
display.setCursor(30,17);
display.print(F("H2O"));
}
if(p2>=0){
display.setCursor(90,17);
display.print(String(p2));
display.print(F("%"));
}else{
display.setCursor(90,17);
display.print(F("H20"));
}
if(p3>=0){
display.setCursor(30,25);
display.print(p3);
display.print(F("%"));
}else{
display.setCursor(30,25);
display.print(F("H20")); }
if(p4>=0){
display.setCursor(90,25);
display.print(p4);
display.print(F("%"));
}else{
display.setCursor(90,25);
display.print(F("H20"));
}
display.display();
}
class moistureSensor{
private:
int outputPin;
public: // Access specifier
float pumpOn = 21;
float pumpOff = 40;
int airValue = 426;
int waterValue = 242;
double waterpumpDelay = 3;
float moistureValue;
float moisturePercent = -1;
int input;
moistureSensor(int input, int outputPin, double waterpumpDelay){
this->input = input;
setOutputPin(outputPin);
this->waterpumpDelay = waterpumpDelay;
}
moistureSensor(int input, int outputPin, double waterpumpDelay, int airValue, int waterValue, float pumpOff, float pumpOn){
this->input = input;
setOutputPin(outputPin);
this->waterpumpDelay = waterpumpDelay;
this->airValue = airValue;
this->waterValue = waterValue;
this->pumpOff = pumpOff;
this->pumpOn = pumpOn;
}
void setOutputPin(int p){
this->outputPin = p;
pinMode(p, OUTPUT);
digitalWrite(p, LOW);
};
void getSoilMoisture(){
moistureValue = analogRead(input);
moisturePercent = map(moistureValue, airValue, waterValue, 0, 100);
if(moisturePercent >= 100){
moisturePercent = 100;
}
if(moisturePercent <=0){
moisturePercent = 0;
}
this->moistureValue = moistureValue;
this->moisturePercent = moisturePercent;
};
bool updateOutput(){
if(outputPin == 0){
return false;
}
getSoilMoisture();
if(moisturePercent < pumpOn){
delay(2500);
digitalWrite(outputPin, HIGH);
// makeRain(waterpumpDelay);
delay(waterpumpDelay*1000);
digitalWrite(outputPin, LOW);
return true;
}
if(moisturePercent > pumpOff){
digitalWrite(outputPin, LOW);
delay(2500);
return true;
}
return false;
};
};
moistureSensor ms1(A0, 7, 3, 445, 242, 21, 40);
moistureSensor ms2(A1, 6, 3, 431, 222, 21, 40);
moistureSensor ms3(A2, 5, 3, 426, 234, 21, 40);
moistureSensor ms4(A3, 4, 3, 466, 210, 21, 40);
void setup(){
Serial.begin(9600);
// initialize with the I2C addr 0x3C
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
splashScreen();
// Clear the buffer.
delay(2500);
display.clearDisplay();
display.display();
// Display Text
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.display();
}
void loop() {
homeScreen(-1, ms2.moisturePercent, ms3.moisturePercent, ms4.moisturePercent);
ms1.updateOutput();
homeScreen(ms1.moisturePercent,-1, ms3.moisturePercent, ms4.moisturePercent);
ms2.updateOutput();
homeScreen(ms1.moisturePercent, ms2.moisturePercent, -1, ms4.moisturePercent);
ms3.updateOutput();
homeScreen(ms1.moisturePercent, ms2.moisturePercent, ms3.moisturePercent, -1);
ms4.updateOutput();
homeScreen(ms1.moisturePercent, ms2.moisturePercent, ms3.moisturePercent, ms4.moisturePercent);
delay(60000);
}