Buenas a todos,
Tengo un desarrollo que funciona y realiza el cometido, sin embargo he querido sumar una SSD1306 SPI (7 pines).
Después de varias pruebas y ensayos, por lo que me pude dar cuenta, que todo se limita al espacio de memoria.
El problema es que, cuando inicializo la SSD1306 , el resto de programa no sigue su curso, pero si deshabilito la SSD1306, todo sigue normal.
El flujo es el siguiente :
- Inicio de sensores
1- Lectura de Sensores
2- Se envía al puerto de Serie los datos de los sensores (recogidos por un ESP01)
3- El ESP01, retorna vía serial una respuesta a la información recibida
4- Se controla la temperatura con PID
5- Punto 1
Al flujo he agregado la SSD1306 para una visualización local, este punto seria el
2.5- SSD1306 muestra los datos de los sensores y los setpoints.
( no pegare el programa del ESP01, ya que, no requiere atención y funciona perfectamente )
Agradezco desde ya cualquier comentario y/o ayuda a resolver.
Saludos.
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_MOSI 11
#define OLED_CLK 13
#define OLED_DC 9
#define OLED_CS 10
#define OLED_RESET 8
#include <DHT.h>
#include <ArduinoJson.h>
#include <PID_v1.h>
#define DHTPIN1 4 // Digital pin connected to the DHT sensor
#define RELE 6
#define PIN_OUTPUT 7
#define termistorPin A0
#define termistorNominalRes 100000
#define termistorNominalTemp 25
#define termistorBValue 3950
#define VoltageDividerResistor 100000
DHT dht1(DHTPIN1, DHT11);
bool lDisplay = true; // Variable para habiltar el inicio de la SSD1306
float termistorRes = 0.0;
float steinhart;
double Setpoint, Input, Output;
double consKp=90, consKi=30, consKd=80;
PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);
String message;
bool switchRele = 0;
bool switchData = true;
int rele = 0;
//Set Time 1
unsigned long stamp1 = 0;
unsigned long stamp2 = 0;
unsigned long diftim1 = 0;
// Set Time 3
unsigned long stamp5 = 0;
unsigned long stamp6 = 0;
unsigned long diftim3 = 0;
String inputString = "";
boolean stringComplete = false;
float h1 = 1.00;
float t1 = 1.00;
float t2 = 1.00;
float SetH = 1.00;
float SetT = 1.00;
float SetN = 1.00;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
void setup() {
Serial.begin(9600);
stamp1 = millis();
stamp5 = millis();
pinMode(RELE,OUTPUT);
digitalWrite(RELE, switchRele);
delay(1000);
dht1.begin();
Input = analogRead(termistorPin);
Setpoint = 30; // SetPoint de seguridad inicial
myPID.SetMode(AUTOMATIC);
if(lDisplay){
if(!display.begin(SSD1306_SWITCHCAPVCC)) {
lDisplay = false;
}else{
display.display();
delay(2000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.cp437(true);
}
}
}
void loop() {
stamp2 = millis();
diftim1 = stamp2-stamp1;
stamp6 = millis();
diftim3 = stamp6-stamp5;
if( (diftim1/1000)>=10&&switchData==false ){
switchData=true;
stamp1=millis();
}
LecturaTemp(); // Sensor NTC de impresora 3D
Sensores();
if(stringComplete){
message=inputString;
inputString="";
stringComplete=false;
Serial.flush();
StaticJsonDocument<300> datos;
datos.clear();
DeserializationError error = deserializeJson(datos, message);
JsonObject root = datos.as<JsonObject>();
Serial.println(message);
if(root["data"]=="nano"){
//Valor de SetPoint
SetH = root["dht11A_hum"].as<float>();
SetT = root["dht11A_tem"].as<float>();
SetN = root["dht11B_tem"].as<float>();
Setpoint = root["setpoint"].as<double>(); // Setpoint variable segun la condicion presente
rele = root["rele5v"];
if(rele!=switchRele){
switchRele=rele;
digitalWrite(RELE,switchRele);
}//IF Rele
}// data Nano
}
yield();
}
void serialEvent() {
while (Serial.available()&&!stringComplete) {
char inChar = (char)Serial.read();
inputString += inChar;
if (inChar == '\n') {
stringComplete = true;
}//If inChar
} // Fin While
if(lDisplay) Oled((int)h1,(int)t1,(int)steinhart,(int)SetH,(int)SetT,(int)SetN);
}
void Sensores(){
if(switchData){
switchData = false;
delay(2000); // Esperamos 2 segundos para medir los sensores
h1 = dht1.readHumidity();
t1 = dht1.readTemperature();
if (isnan(h1) || isnan(t1)) {
h1 = 1.00;t1 = 1.00;
Output = 0.0;
}else{
// Datos a enviar
Serial.print("{'data':'esp8266','estado':0,'humedadA':"+String(h1)+",'tempboxA':"+String(t1)+",'setpoint':"+String(Setpoint)+",'tempboxB':"+String((int)steinhart)+",'rele5v':2,'Mensaje':''}\n");
}
}// IF switchData
}
void LecturaTemp(){
if( (diftim3/1000)>=1 ){
termistorRes = ((float)analogRead (termistorPin)* VoltageDividerResistor)/(1023 - (float)analogRead (termistorPin));
steinhart = termistorRes / termistorNominalRes; // (R/Ro)
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= termistorBValue; // 1/B * ln(R/Ro)
steinhart += 1.0 / (termistorNominalTemp + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // Invert
steinhart -= 273.15;
Input = steinhart;
myPID.Compute();
analogWrite(PIN_OUTPUT, Output);
stamp5=millis();
}
}
void Oled(int valor1, int valor2, int valor3, int set1, int set2, int set3){
display.clearDisplay();
display.display();
//display.drawPixel(127, 63, WHITE); // This command will help you to print a pixel on display , its the last pixel, coordinate 127,63
//display.drawPixel(0, 0, WHITE); // pixel with 0,0 coordinate
/* ---------TITULO---------- */
//display.drawRect(0, 0, display.width()-2, 13, SSD1306_WHITE);
display.setCursor((display.width()/2)-23,3);
display.setTextSize(1);
display.println("MONITOR");
/* ---VALOR HUMEDAD CAJA---- */
display.setTextSize(1);
display.setCursor(2,20);
display.print("Hum : ");
display.print(valor1);
display.print((char)37);
/* ----VALOR TEMPERATURA CAJA*/
display.setTextSize(1);
display.setCursor(2,28);
display.print("Tem : ");
display.print(valor2);
display.print((char)248);
/* ----VALOR TEMPERATURA NTC */
display.setTextSize(1);
display.setCursor(2,36);
display.print("NTC : ");
display.print(valor3);
display.print((char)248);
display.setCursor(2,55);
display.print("H:");
display.print(set1);
display.setCursor(42,55);
display.print("T:");
display.print(set2);
display.setCursor(82,55);
display.print("N:");
display.print(set3);
display.display();
}

