ESP8266 + Cayenne + SD Card

Hi.

I am trying to save temperature data on Cayenne and on SD Card, but its not working.
My code is working when i try just to save data on Cayenne, but when i modify the code to save the data on SD card, its now working.

Can anyone help me to solve this problem ?

can you share the code you are using?
Also do not create multiple topic on same issue.

@shramik_salgaonkar This is the code. I dont know why its not working.


#include <SPI.h>
#include <SD.h>
#define CAYENNE_DEBUG
#define CAYENNE_PRINT Serial
#include <CayenneMQTTESP8266.h>
#include "DHT.h"
#define DHTPIN 12    // modify to the pin we connected
#define DHTTYPE AM2301   // AM2301 
 
DHT dht(DHTPIN, DHTTYPE);
const int chipSelect = D8;
File myFile;

// WiFi network info.
char ssid[] = "********";
char wifiPassword[] = "********";

// Cayenne authentication info. This should be obtained from the Cayenne Dashboard.
char username[] = "**************************";
char password[] = "**************************";
char clientID[] = "**************************";

unsigned long lastMillis = 0;

void setup() {
  Serial.begin(115200);
  Cayenne.begin(username, password, clientID, ssid, wifiPassword);
  dht.begin();


while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
 
  Serial.print("Initializing SD card...");
 
  if (!SD.begin(chipSelect)) 
  {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  dht.begin();

}
void loop() {
  Cayenne.loop();

  //Publish data every 10 seconds (10000 milliseconds). Change this value to publish at a different interval.
  if (millis() - lastMillis > 14400000) {
    lastMillis = millis();
    //Write data to Cayenne here. This example just sends the current uptime in milliseconds.
    Cayenne.virtualWrite(0, lastMillis);

    float humidity = dht.readHumidity();
    float temperature = dht.readTemperature();
    Cayenne.celsiusWrite(1, temperature);
    Cayenne.virtualWrite(2, humidity, "rel_hum", "p");
  }

delay(2000);
  myFile = SD.open("dht11.csv", FILE_WRITE);
      // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature(true);
  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) 
  {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  // if the file opened okay, write to it:
  if (myFile) 
  {
    Serial.print("opened dht11.csv...");
    myFile.print(h);
    myFile.print(",");
    myFile.print(t);
    myFile.print(",");
    myFile.println(f);
    // close the file:
    myFile.close();
    Serial.println("closed dht11.csv.");
  } 
  else 
  {
    // if the file didn't open, print an error:
    Serial.println("error opening dht11.csv");
  }

  
}

//Default function for processing actuator commands from the Cayenne Dashboard.
//You can also use functions for specific channels, e.g CAYENNE_IN(1) for channel 1 commands.
CAYENNE_IN_DEFAULT()
{
  CAYENNE_LOG("CAYENNE_IN_DEFAULT(%u) - %s, %s", request.channel, getValue.getId(), getValue.asString());
  //Process message here. If there is an error set an error message using getValue.setError(), e.g getValue.setError("Error message");
}

What are you getting in the serial monitor?

This is what i am getting in the serial monitor. Also the widget are not created automatically in the dashboard.

make sure you have connected the sensor and sd card correctly.

Yes, i have connected them correctly.

well, your serial monitor says so. try to run individual sensor and sd card code and see if it works.

@shramik_salgaonkar this code is working with cayenne. Can you help me to save the same data on sd card please?
I have tried many thing but its not working.


// This example shows how to connect AM2301/DHT21 to Cayenne using an ESP8266 and send/receive sample data.
// Make sure you install the ESP8266 Board Package via the Arduino IDE Board Manager and select the correct ESP8266 board before compiling.

#define CAYENNE_DEBUG
#define CAYENNE_PRINT Serial
#include <CayenneMQTTESP8266.h>
#include “DHT.h”
#define DHTPIN 12 // modify to the pin we connected
#define DHTTYPE AM2301 // AM2301

DHT dht(DHTPIN, DHTTYPE);

// WiFi network info.
char ssid = “***";
char wifiPassword[] = "
”;

// Cayenne authentication info. This should be obtained from the Cayenne Dashboard.
char username = “";
char password[] = "
”;
char clientID = “******************************************”;

unsigned long lastMillis = 0;

void setup() {
Serial.begin(115200);
Cayenne.begin(username, password, clientID, ssid, wifiPassword);
dht.begin();
}

void loop() {
Cayenne.loop();

//Publish data every 10 seconds (10000 milliseconds). Change this value to publish at a different interval.
if (millis() - lastMillis > 10000) {
lastMillis = millis();
//Write data to Cayenne here. This example just sends the current uptime in milliseconds.
Cayenne.virtualWrite(0, lastMillis);

float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
Cayenne.celsiusWrite(1, temperature);
Cayenne.virtualWrite(2, humidity, "rel_hum", "p");

}
}

//Default function for processing actuator commands from the Cayenne Dashboard.
//You can also use functions for specific channels, e.g CAYENNE_IN(1) for channel 1 commands.
CAYENNE_IN_DEFAULT()
{
CAYENNE_LOG(“CAYENNE_IN_DEFAULT(%u) - %s, %s”, request.channel, getValue.getId(), getValue.asString());
//Process message here. If there is an error set an error message using getValue.setError(), e.g getValue.setError(“Error message”);
}

have you tried and seen if SD card standalone code works?