Nodemcu v1.0 flash hafızaya kayıt yardım

kumandan11

Üye
Katılım
4 Ağu 2013
Mesajlar
26
Puanları
1
Merhaba,
Arduino konusunda acemiyim yardımlarınızı bekliyorum.

Kod çalışması;

Nodemcu v1.0 kullanarak DHT11 sensöründen gelen sıcaklık ve nem bilgisini MySql ( PhpMyadmin) database gönderiyorum.

Ek olarak yapmaya çalıştığım;

Wifi kesildiğinde veya MySQL ( PhpMyadmin ) 'e bağlanamadığımda sensör bilgilerini nodemcunun kendi hafızasına ( flash memory) kaydetmek ve wifiye ve phpmyadmine tekrar bağlandığımda kaydettiğim flash memoryden okuyup database e gördermek ( güncellemek ) istiyorum. Bunu nasıl yapabilirim ?

Araştırdıklarım;

EEPROM.h library , LittleFS dosya sistemi ve SPIFFS.h library bu 3 konu hakkında araştırma yaptım. Ama tam kafamda hangisini kullanmam konusunda bir fikir oluşturamadım. Sizce hangisini kullanmalıyım? Ve kodu nasıl yazmalıyım ? Kodum ektedir.
Kod:
/* Bu arduino kodu her 30 saniyede bir mysql sunucusuna veri gönderiyor.

#include "DHT.h"
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <SPI.h>
#include <MFRC522.h>

#define DHTPIN D2

#define DHTTYPE DHT11

DHT dht(DHTPIN,DHTTYPE);


float humidityData; // NEM
float temperatureData; // SICAKLIK
// RGB LED PİNLERİ
int redpin = D7;
int greenpin = D6;
int bluepin = D5;


const char *ssid = "";
const char *password = "";
//WiFiClient client;
char server[] = "";   //ıp adresim


WiFiClient client;  


void setup()
{
 Serial.begin(115200);

//
  pinMode(D7, OUTPUT);
  pinMode(D6, OUTPUT);
  pinMode(D5, OUTPUT);
  analogWriteRange(99); //PWM: 0~99
  delay(10);
  dht.begin();
  // WİFİ BAĞLANTISI
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
 
  // Start the server
  // server.begin();
  Serial.println("Server started");
  Serial.println(WiFi.localIP());
  delay(1000);
  Serial.println("connecting...");
 }
void loop()
{
  humidityData = dht.readHumidity();
  temperatureData = dht.readTemperature();
  Sending_To_phpmyadmindatabase();
  delay(30000); // interval
 }

 void Sending_To_phpmyadmindatabase()   //MYSQL BAĞLANMA
 {
   if (client.connect(server, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    Serial.print("GET /testcode/dht.php?humidity=");
    client.print("GET /testcode/dht.php?humidity=");     // PHP KODUNU ALDIĞIMIZ VE PHP YE VERİ GÖNDERDİĞİMİZ KOD
    Serial.println(humidityData);
    client.print(humidityData);
    client.print("&temperature=");
    Serial.println("&temperature=");
    client.print(temperatureData);
    Serial.println(temperatureData);
    client.print(" ");      //SPACE BEFORE HTTP/1.1
    client.print("HTTP/1.1");
    client.println();
    client.println("Host:  "); // ıp adresim
    client.println("Connection: close");
    client.println();

    analogWrite(redpin,0);
    analogWrite(greenpin,255);
    analogWrite(bluepin,0);
  } else {
    //SERVER A BAĞLANMADIYSAK:
    Serial.println("connection failed");
    analogWrite(redpin,255);
    analogWrite(greenpin,0);
    analogWrite(bluepin,0);
  }
 }
 

Ekli dosyalar

  • Nodemcu sıcaklık ve nem.rar
    1.7 KB · Görüntüleme: 0
Son düzenleme:
Burada önemli olan ne kadarlık bir süreden bahsediyoruz. ESP8266 nın ayrı bir EEPromu yoktur onun yerine flash beleğinin 4kb lık kısmı bu işe ayrılmıştır. Sen 2 tane float tipi data kaydedeceksin. yani toplam 8 byte. 4096/8 = 512 tane kayıt yapabilirsin. yukarıdaki kod 30sn de bir kayıt yaptığı için 4 saat gibi bir sürede kapasite dolacaktır. Eğer bu sana yeterse en kolayı eeprom kullanmaktır. Doğrudan datayı adresinden çağırırsın. Şu örneği incele.

Eğer daha fazla data kaydetmek istiyorsan littleFS kullanman gerekiyor ama dosya olarak işlem yapacaksın. Yani datayı tek tek çağıramazsın ancak aynı dosyadan satır satır okursun. Şu örnek ilgili işlemlerin hepsini göstermiş.
 
Cevaplarınız teşekkür ederim. Pazar günü yapmaya çalışıcam. Başarılı olursam kodu burada paylaşırım.
 
Merhaba kodu LittleFS ile string olarak yazıktan sonra tekrar datayı database e göndermek için okumak istediğim zaman nasıl float 'a dönüştürebilirim ? Ve dediğiniz gibi satır satır okuyup nasıl database ' e gönderebilirim. Php kodunuda paylaştım.
sendval = float(temperatureData);
sendval2 = float(humidityData);
postData = "sendval=" + sendval + "&sendval2=" + sendval2;
writeData(String postData);


void readData()
{
//Open the file
File dosyam = LittleFS.open("/SavedFile.txt", "r");
//Check if the file exists
if(!dosyam){
//Read the file data and display it on serial
Serial.println("No Saved Data!");
return;
}


while(dosyam.available()){
postData1 = dosyam.read();
Serial.println("Veriler okundu");
}

//Close the file
dosyam.close();
}
void writeData(String postData)
{
//Open the file
File dosyam = LittleFS.open("/SavedFile.txt", "w");
if (dosyam) {
Serial.println("Dosya Başarıyla Yazma için Açıldı");

}
else {
Serial.println("Dosya Yazma için Açılırken Hata Oluştu!");
}

//Write to the file
dosyam.print(postData);
//Close the file
dosyam.close();
delay(1);
Serial.println("Yazma Başarılı");
Kod:
<?php
class dht11{
 public $link='';
 function __construct($temperature, $humidity){
  $this->connect();
  $this->storeInDB($temperature, $humidity);
 }
 
 function connect(){
  $this->link = mysqli_connect('localhost','root','') or die('Cannot connect to the DB');
  mysqli_select_db($this->link,'temphumid') or die('Cannot select the DB');
 }
 
 function storeInDB($temperature, $humidity){
  $query = "insert into dht11 set humidity='".$humidity."', temperature='".$temperature."'";
  $result = mysqli_query($this->link,$query) or die('Errant query:  '.$query);
 }
 
}
if($_GET['temperature'] != '' and  $_GET['humidity'] != ''){
 $dht11=new dht11($_GET['temperature'],$_GET['humidity']);
}
?>
 
Merhaba ,

Server'a bağlandığımda LiitleFS hafızadan okurken serial monitörde düzgün okuyor ve phpmyadmin ( mysql) düzgün atıyormuş gibi gözüküyor ama sadece tek bir veri gönderiyor. Mesela hafızada 20 veri varsa sadece 1 veri alıyorum. Neden kaynaklanıyor yardım ederseniz sevinirim. Sanırım sorun php kodunda php kodu yukarıdaki mesajdadır. Örnek serial

connected
Use this URL to connect: http://192.168.0.222/ // örnek ip adres
01 22 20 29/11/21 10:05:27
GET /testcode/dht.php?humidity=20.00
&temperature=
22.00
02 22 20 29/11/21 10:05:58
GET /testcode/dht.php?humidity=20.00
&temperature=
22.00
03 22 20 29/11/21 10:06:28
GET /testcode/dht.php?humidity=20.00
&temperature=
22.00
04 22 20 29/11/21 10:06:59
GET /testcode/dht.php?humidity=20.00
&temperature=
22.00
05 22 20 29/11/21 10:07:29
GET /testcode/dht.php?humidity=20.00
&temperature=
22.00
Kod:
if (client.connect(server, 80)) {
    Serial.println("connected");
    Serial.println("Use this URL to connect: http://"+WiFi.localIP().toString()+"/");// Print the IP address

    File datafile = SPIFFS.open(DataFile, "r");
    if (datafile.available()) { // if the file is available, read from it
      int read_ahead = datafile.parseInt(); // Sometimes at the end of file, NULL data is returned, this tests for that
    if (read_ahead != 0) { // Probably wasn't null data to use it, but first data element could have been zero and there is never a record 0!
      sensor_data[index_ptr].lcnt  = read_ahead ;
      sensor_data[index_ptr].temp  = datafile.parseFloat()*10;
      sensor_data[index_ptr].humi  = datafile.parseFloat()*10;
      sensor_data[index_ptr].ltime = datafile.readStringUntil('.');
      sensor_data[index_ptr].ltime.trim();
      index_ptr += 1;
      log_count += 1;
    }
    if (index_ptr > table_size) {
      for (int i = 0; i < table_size; i++) {
         sensor_data[i].lcnt  = sensor_data[i+1].lcnt;
         sensor_data[i].temp  = sensor_data[i+1].temp;
         sensor_data[i].humi  = sensor_data[i+1].humi;
         sensor_data[i].ltime = sensor_data[i+1].ltime;
         sensor_data[i].ltime.trim();
      }
      index_ptr = table_size;
    }
    for (int i = 0; i <= index_ptr; i++) {
      Serial.println(((i<10)?"0":"")+String(sensor_data[i].lcnt)+" "+String(sensor_data[i].temp)+" "+String(sensor_data[i].humi)+" "+String(sensor_data[i].ltime));
      humidityData = float(sensor_data[i].humi);
      temperatureData = float(sensor_data[i].temp);
   
      Serial.print("GET /testcode/dht.php?humidity=");
      client.print("GET /testcode/dht.php?humidity=");     //YOUR URL
      Serial.println(humidityData);
      client.print(humidityData);
      client.print("&temperature=");
      Serial.println("&temperature=");
      client.print(temperatureData);
      Serial.println(temperatureData);
      client.print(" ");      //SPACE BEFORE HTTP/1.1
      client.print("HTTP/1.1");
      client.println();
      client.println("Host: 192.168.0.222"); // örnek ip
      client.println("Connection: close");
      client.println();
      delay(5000);
  } }
  datafile.close();
  if (SPIFFS.exists(DataFile)) {
      SPIFFS.remove(DataFile);
      Serial.println(F("File deleted successfully"));
      reset_array();
    }
 
    // Make a HTTP request:
    Serial.print("GET /testcode/dht.php?humidity=");
    client.print("GET /testcode/dht.php?humidity=");     //YOUR URL
    Serial.println(humi);
    client.print(humi);
    client.print("&temperature=");
    Serial.println("&temperature=");
    client.print(temp);
    Serial.println(temp);
    client.print(" ");      //SPACE BEFORE HTTP/1.1
    client.print("HTTP/1.1");
    client.println();
    client.println("Host: 192.168.0.222");  // örnek ip
    client.println("Connection: close");
    client.println();
  } else {
 
  Bağlanmadıysa hafızaya kayıt ediyorum }
 
Son düzenleme:
Merhaba ,

Server'a bağlandığımda LiitleFS hafızadan okurken serial monitörde düzgün okuyor ve phpmyadmin ( mysql) düzgün atıyormuş gibi gözüküyor ama sadece tek bir veri gönderiyor. Mesela hafızada 20 veri varsa sadece 1 veri alıyorum. Neden kaynaklanıyor yardım ederseniz sevinirim. Sanırım sorun php kodunda php kodu yukarıdaki mesajdadır. Örnek serial

connected
Use this URL to connect: http://192.168.0.222/ // örnek ip adres
01 22 20 29/11/21 10:05:27
GET /testcode/dht.php?humidity=20.00
&temperature=
22.00
02 22 20 29/11/21 10:05:58
GET /testcode/dht.php?humidity=20.00
&temperature=
22.00
03 22 20 29/11/21 10:06:28
GET /testcode/dht.php?humidity=20.00
&temperature=
22.00
04 22 20 29/11/21 10:06:59
GET /testcode/dht.php?humidity=20.00
&temperature=
22.00
05 22 20 29/11/21 10:07:29
GET /testcode/dht.php?humidity=20.00
&temperature=
22.00
Kod:
if (client.connect(server, 80)) {
    Serial.println("connected");
    Serial.println("Use this URL to connect: http://"+WiFi.localIP().toString()+"/");// Print the IP address

    File datafile = SPIFFS.open(DataFile, "r");
    if (datafile.available()) { // if the file is available, read from it
      int read_ahead = datafile.parseInt(); // Sometimes at the end of file, NULL data is returned, this tests for that
    if (read_ahead != 0) { // Probably wasn't null data to use it, but first data element could have been zero and there is never a record 0!
      sensor_data[index_ptr].lcnt  = read_ahead ;
      sensor_data[index_ptr].temp  = datafile.parseFloat()*10;
      sensor_data[index_ptr].humi  = datafile.parseFloat()*10;
      sensor_data[index_ptr].ltime = datafile.readStringUntil('.');
      sensor_data[index_ptr].ltime.trim();
      index_ptr += 1;
      log_count += 1;
    }
    if (index_ptr > table_size) {
      for (int i = 0; i < table_size; i++) {
         sensor_data[i].lcnt  = sensor_data[i+1].lcnt;
         sensor_data[i].temp  = sensor_data[i+1].temp;
         sensor_data[i].humi  = sensor_data[i+1].humi;
         sensor_data[i].ltime = sensor_data[i+1].ltime;
         sensor_data[i].ltime.trim();
      }
      index_ptr = table_size;
    }
    for (int i = 0; i <= index_ptr; i++) {
      Serial.println(((i<10)?"0":"")+String(sensor_data[i].lcnt)+" "+String(sensor_data[i].temp)+" "+String(sensor_data[i].humi)+" "+String(sensor_data[i].ltime));
      humidityData = float(sensor_data[i].humi);
      temperatureData = float(sensor_data[i].temp);
 
      Serial.print("GET /testcode/dht.php?humidity=");
      client.print("GET /testcode/dht.php?humidity=");     //YOUR URL
      Serial.println(humidityData);
      client.print(humidityData);
      client.print("&temperature=");
      Serial.println("&temperature=");
      client.print(temperatureData);
      Serial.println(temperatureData);
      client.print(" ");      //SPACE BEFORE HTTP/1.1
      client.print("HTTP/1.1");
      client.println();
      client.println("Host: 192.168.0.222"); // örnek ip
      client.println("Connection: close");
      client.println();
      delay(5000);
  } }
  datafile.close();
  if (SPIFFS.exists(DataFile)) {
      SPIFFS.remove(DataFile);
      Serial.println(F("File deleted successfully"));
      reset_array();
    }
 
    // Make a HTTP request:
    Serial.print("GET /testcode/dht.php?humidity=");
    client.print("GET /testcode/dht.php?humidity=");     //YOUR URL
    Serial.println(humi);
    client.print(humi);
    client.print("&temperature=");
    Serial.println("&temperature=");
    client.print(temp);
    Serial.println(temp);
    client.print(" ");      //SPACE BEFORE HTTP/1.1
    client.print("HTTP/1.1");
    client.println();
    client.println("Host: 192.168.0.222");  // örnek ip
    client.println("Connection: close");
    client.println();
  } else {
 
  Bağlanmadıysa hafızaya kayıt ediyorum }
İlk datayı gönderip bağlantıyı kapatıyorsun da o yüzden sadece ilki gidiyor. Her seferinde bağlantıyı açıp datayı gönderip tekrar kapatman gerekiyor.

C++:
    for (int i = 0; i <= index_ptr; i++) {
      client.connect(server, 80);
      Serial.println(((i<10)?"0":"")+String(sensor_data[i].lcnt)+" "+String(sensor_data[i].temp)+" "+String(sensor_data[i].humi)+" "+String(sensor_data[i].ltime));
      humidityData = float(sensor_data[i].humi);
      temperatureData = float(sensor_data[i].temp);
 
      Serial.print("GET /testcode/dht.php?humidity=");
      client.print("GET /testcode/dht.php?humidity=");     //YOUR URL
      Serial.println(humidityData);
      client.print(humidityData);
      client.print("&temperature=");
      Serial.println("&temperature=");
      client.print(temperatureData);
      Serial.println(temperatureData);
      client.print(" ");      //SPACE BEFORE HTTP/1.1
      client.print("HTTP/1.1");
      client.println();
      client.println("Host: 192.168.0.222"); // örnek ip
      client.println("Connection: close");
      client.println();
      delay(5000);
  }
 
Herşey için teşekkür ederim. Çalıştı.
 

Forum istatistikleri

Konular
127,952
Mesajlar
913,873
Kullanıcılar
449,599
Son üye
Gksn

Yeni konular

Geri
Üst