Sari la conținut
ELFORUM - Forumul electronistilor

Problema cantar la iesirea din deep sleep


Postări Recomandate

Nu este un copy/paste de pe net, nu ma pricep la programarea, dar am incercat si am reusit cat de cat singur cu ajutorul unui coleg de pe forum si uitanduma pe youtube cum v-am spus. conditia cu "millis" la care era 10 sec. era pusa ca sa trimita din 10 in 10 sec. si era inainte sa sa aflu ca ESP-ul il pot baga la somn , acum pot renunta la ea.

Acum sa descriu ce vreau sa fac:

un sistem de monitorizare care sa imi cantareasca un stup, sa monitorizeze temperatura, presiunea atmosferica, umiditatea si bateria, datele colectate le trimite care un site unde le pot vedea,

mai atasez odata codul unde nu este implementata functia de somn

ca senzor de temperatura si umezeala folosesc un AM2302, pentru presiune atmosferica un BMP280, iar pentru alimentare un acumulator Li-ion de 3.7v 3500mAh cu stabilizator de 3v si cu dvizor de rezistente pentru citirea tensiunii bateriei.

#include <dht.h>
#include "HX711.h"
#include <SoftwareSerial.h>
#include <Adafruit_BMP280.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
#include <SPI.h>
#include <ESP8266WiFi.h>

const int LOADCELL_DOUT_PIN = D5;
const int LOADCELL_SCK_PIN = D6;

#define DEBUG true

HX711 scale; // working

dht DHT;
Adafruit_BMP280 barometru;

int k = 0;
int offset = -200; // corectie citire tensiune baterie
char diviziune;

#include "UbidotsMicroESP8266.h"
#define TOKEN  "BBFF-Ii7WT6576bf3pKFdnTc9T4h5IuX9JB0"  // Put here your Ubidots TOKEN
#define WIFISSID "9888O"
#define PASSWORD "p988888966"

Ubidots client(TOKEN);
unsigned long lastMillis = 0;

void setup() {

  Serial.begin(115200);
  delay(10);
  client.wifiConnection(WIFISSID, PASSWORD);

  if (! barometru.begin(0x76 )) {
    Serial.println("Lipsa senzor BMP280, Verifica cablaj!");
    while (1);
  }

  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
  scale.read();                 // print a raw reading from the ADC
  scale.read_average(20);       // print the average of 20 readings from the ADC
  scale.get_value(5);           // print the average of 5 readings from the ADC minus the tare weight (not set yet)
  scale.get_units(5), 1;        // print the average of 5 readings from the ADC minus tare weight (not set) divided
  scale.set_scale(393.95f);     // corectie celula greutate

  scale.tare();                 // resetare cantar 0
  scale.read();                 // print a raw reading from the ADC
  scale.read_average(20);       // print the average of 20 readings from the ADC

}

int kg = 0;


void loop() {

  int volt = analogRead(A0);  // pin citire tensiune
  double voltage = map(volt, 0, 1023, 0, 2500) + offset; // map 0-1023 la 0-2500 si factor de corectie
  voltage /= 100;                                       // mv --> V

  float diviziune = (3.7 - 2.5) / 100  ;
  float procent = (voltage - 2.5) / diviziune;
  procent = constrain(procent, 0, 100);

  float weight = scale.get_units(10);
  kg = 0;
  
     if (millis() - lastMillis > 10000) {  ///every 10s
    int readData = DHT.read22(D7);
    float UmiditateExterioara = DHT.humidity;
    float TemperaturaExterioara = DHT.temperature;
    float PresiuneAtmosferica = barometru.readPressure() / 100;

    lastMillis = millis();
    client.add("UmiditateExterioara",UmiditateExterioara );
    client.add("TemperaturaExterioara", TemperaturaExterioara );
    client.add("PresiuneAtmosferica", PresiuneAtmosferica );
    client.add("procent", procent );
    client.add("weight", weight );


    client.sendAll(true);

  }

}

 

Link spre comentariu
  • Răspunsuri 44
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Ok, daca zici ca esti si incepator hai sa o luam incet cu incet si construim in sus, mai inveti si tu ceva. Asa cu toata taraba de senzori si WIFI din prima nu prea e ok, e bine sa incepi cu pasi mici sa si intelegi ce faci pe acolo. Insa daca vrei sa te ajut atunci trebuie sa te implici si sa incerci sa faci ce iti zic si dupa te mai ajut daca nu intelegi ceva.

 

1. Faci un proiect nou gol.

2. Adaugi libraria si senzorul BMP280 si DHT

3. In functia loop citesti acesti senzori cum ai facut si pana acuma

4. La fiecare 10s scrii valorile de la cei 2 senzori pe portul Serial  ( Serial.println )

 

  Cam asta ar fi primul pas, fara partea de cantar si WIFI ele sunt putin mai complicate si vreau sa ma asigur intai ca poti citii corect intai BMP si DHP - ul. Dupa ce ai totul frumos printat pe consola Seriala postezi codul si iti arat cum sa-l aranjezi mai elegant in functii sa nu fie trantite toate in functia loop una peste alta dupa care mergem mai departe la partea de cantar si WIFI la urma dupa ce te-ai convins ca toate datele sunt corecte. 

  

  Pentru partea de alimentare zici ca folosesti li-ion cu stabilizator 3V,ma gandesc ca ai ales un stabilizator cat de cat, zic pt ca cele "standard" gen LM78xx sau linearii obisnuiti au curent de mers in gol de circa 5-6mA si nu obtii cele mai bune rezultate cu ele, la fel si cu divizorul pentru tensiunea bateriei ar trebuii alesi rezistori de valoare mare pentru a minimaliza pierderile (sunt si alte de a scoate divizorul in afara circuitului pentru a nu mai consuma dar mai complicat), acuma depinde si la ce autonomie te astepti sunt tot felul de optimizari care se pot face pentru a reduce consumul la absolut minim, eu am circuite similare care trimit date la anumite intervale de timp si consuma in jur de 5mA intr-o saptamana ( nici nu au baterii ci supercondensator incarcat solar de la o mica celula solara)

    

Link spre comentariu

Salut, 

Mulțumesc mult pentru ajutor.

Mâine abia aștept sa fac programelul și îl postez.

ca stabilizator de tens folosesc In MCP 1700-3302E cu 2 condensatori 100nF respectiv 100uF, iar la divizor am 30k cu 7,5k.

M-am gândit și eu la varianta cu o celula solară cu care sa incarc acumulatorul, dar dacă reușesc sa îl fac sa consume puțin cred ca îmi e de ajuns acumulatorul, ideea cu super condensatori și celul, mu se pare o idee super

 

Link spre comentariu

Gata am un proiect nou, il atasez mai jos

#include <Adafruit_BMP280.h>
#include <dht.h>
#include <SPI.h>

dht DHT;
Adafruit_BMP280 barometru;

void setup() {
  Serial.begin(115200);
  delay(10);
  if (! barometru.begin(0x76 )) {
    Serial.println("Lipsa senzor BMP280, Verifica cablaj!");
    while (1);
  }
}

void loop() {
    
  int readData = DHT.read22(D7);
  float temp = DHT.temperature; 
  float humidity = DHT.humidity;
  Serial.print("Temperatura exterioara: ");
  Serial.println(temp);
  Serial.print("Umiditate exterioara: ");
  Serial.println(humidity);
  Serial.print("Presiune atmosferica: ");
  Serial.println(barometru.readPressure()/100);
  delay(10000);

  }

pe serial imi afiseaza:

Citat

10:23:36.492 -> {l

10:23:36.691 -> Umiditate exterioara: 35.00
10:23:36.691 -> Presiune atmosferica: 1017.64
10:23:46.691 -> Temperatura exterioara: 23.00
10:23:46.691 -> Umiditate exterioara: 35.00

10:23:46.691 -> Presiune atmosferica: 1017.68

 

la prima afisare imi arata un sir de caractere dar apoi isi revine.

Inca o data multumesc mult pentru ajutor

Link spre comentariu

Salut, 

  Foarte buna alegerea regulatorului e fix ce trebuie pentru consum mic, divizorul iarasi este ok. Sirul initial de caractere este din bootloader-ul de fabrica cu ce vine ESP-ul, iti da niste informatii despre uC.

 

  Pasul urmator e sa adaugam inapoi citirea bateriei insa nu in functia "loop" pentru ca sunt mai multe linii de cod, se aglomereaza functia loop si e dupa aia mai greu de dedus ce linie de cod ce face. Pentru asta am facut eu primii pasi:

 

   1. am creat o functie noua denumita "getBatteryStatus", tipul functiei este "float" pentru ca asta obtineai initial pentru procente (cred ca ar merge mai simplu numar intreg, nu stiu daca are mult sens sa vezi la afisare procentaje de genul 75.6% in loc de doar 75%).

  2. in functia "loop" am adaugat un nou parametru si am apelat functia noua.

 

  Ce urmeaza sa faci tu este:

     1. in functia noua adaugi liniile de cod prin care citeai si calulai procentajul la baterie si la finalul functiei adaugi "return  procent;", acest return trimite rezultatul obtinut in variabila "procent" inapoi in functia loop ( asta in cazul in care nu stiai deja asta)

    2. Adaugi langa celalalte printari in consola si procentajul bateriei.

    3. In acelasi maniera faci o functie gen "InitScale" (acesta va fi de tip "void" pentru ca nu trebuie sa trimita nici o valuare inapoi) in care bagi liniile de cod pentru cantar care initial erau in "setup" iar in "setup" doar apelezi functia noua, o sa ne fie util cand implementam deepSleep.

    4.  Printezi si citirea cantarului

 

 

#include <Adafruit_BMP280.h>
#include <dht.h>
#include <SPI.h>

dht DHT;
Adafruit_BMP280 barometru;

void setup() {
  Serial.begin(115200);
  delay(10);
  if (! barometru.begin(0x76 )) {
    Serial.println("Lipsa senzor BMP280, Verifica cablaj!");
    while (1);
  }
}

float getBatteryStatus() {


}

void loop() {
    
  int readData = DHT.read22(D7);
  float temp = DHT.temperature; 
  float humidity = DHT.humidity;
  float batteryStatus = getBatteryStatus();
  
  Serial.print("Temperatura exterioara: ");
  Serial.println(temp);
  Serial.print("Umiditate exterioara: ");
  Serial.println(humidity);
  Serial.print("Presiune atmosferica: ");
  Serial.println(barometru.readPressure()/100);
  delay(10000);

  }

 

 

Spor.

Editat de Bandi Szasz
Link spre comentariu

Salut,

Am facut partea cu bateria, sper sa fie ok, iar la partea de cantar m-am incurcat putin (putin mai mult)

#include <Adafruit_BMP280.h>
#include <dht.h>
#include <SPI.h>
#include "HX711.h"

const int LOADCELL_DOUT_PIN = D5;
const int LOADCELL_SCK_PIN = D6;


dht DHT;
HX711 scale;
Adafruit_BMP280 barometru;


int offset = -200; // corectie citire tensiune baterie

void setup() {
  Serial.begin(115200);
  delay(10);
  if (! barometru.begin(0x76 )) {
    Serial.println("Lipsa senzor BMP280, Verifica cablaj!");
    while (1);
  }

}

float getBatteryStatus() {
  int volt = analogRead(A0);  // pin citire tensiune
  double voltage = map(volt, 0, 1023, 0, 2500) + offset; // map 0-1023 la 0-2500 si factor de corectie
  voltage /= 100;                                        // mv --> V

  float diviziune = (3.7 - 2.5) / 100  ;
  float procent = (voltage - 2.5) / diviziune;
  procent = constrain(procent, 0, 100);
  return  procent;

}


void InitScale () {
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
  scale.read();                 // print a raw reading from the ADC
  scale.read_average(20);       // print the average of 20 readings from the ADC
  scale.get_value(5);           // print the average of 5 readings from the ADC minus the tare weight (not set yet)
  scale.get_units(5), 1;        // print the average of 5 readings from the ADC minus tare weight (not set) divided
  scale.set_scale(393.95f);     // corectie celula greutate

  scale.tare();                 // resetare cantar 0
  scale.read();                 // print a raw reading from the ADC
  scale.read_average(20);       // print the average of 20 readings from the ADC

}

void loop() {

  int readData = DHT.read22(D7);
  float temp = DHT.temperature;
  float humidity = DHT.humidity;
  float batteryStatus = getBatteryStatus();


  Serial.print("Temperatura exterioara: ");
  Serial.println(temp);
  Serial.print("Umiditate exterioara: ");
  Serial.println(humidity);
  Serial.print("Presiune atmosferica: ");
  Serial.println(barometru.readPressure() / 100);
  Serial.print("Procent baterie: ");
  Serial.println(batteryStatus);
  //Serial.print("Greutate: ");
  //Serial.println(weight);

  delay(10000);

}

pe serial imi afiseaza

Citat

11:03:15.758 -> Temperatura exterioara: 23.80
11:03:15.758 -> Umiditate exterioara: 39.00
11:03:15.758 -> Presiune atmosferica: 1012.26
11:03:15.798 -> Procent baterie: 100.00

 

 

Editat de piratu2ro
Link spre comentariu

gata am reusit uitasem sa apelez functia in setup

#include <Adafruit_BMP280.h>
#include <dht.h>
#include <SPI.h>
#include "HX711.h"

const int LOADCELL_DOUT_PIN = D5;
const int LOADCELL_SCK_PIN = D6;


dht DHT;
HX711 scale;
Adafruit_BMP280 barometru;


int offset = -200; // corectie citire tensiune baterie

void setup() {
  Serial.begin(115200);
  delay(10);
  if (! barometru.begin(0x76 )) {
    Serial.println("Lipsa senzor BMP280, Verifica cablaj!");
    while (1);
  }
 InitScale ();
 } 

float getBatteryStatus() {
  int volt = analogRead(A0);  // pin citire tensiune
  double voltage = map(volt, 0, 1023, 0, 2500) + offset; // map 0-1023 la 0-2500 si factor de corectie
  voltage /= 100;                                        // mv --> V

  float diviziune = (3.7 - 2.5) / 100  ;
  float procent = (voltage - 2.5) / diviziune;
  procent = constrain(procent, 0, 100);
  return  procent;

}


void InitScale () {
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
  scale.read();                 // print a raw reading from the ADC
  scale.read_average(20);       // print the average of 20 readings from the ADC
  scale.get_value(5);           // print the average of 5 readings from the ADC minus the tare weight (not set yet)
  scale.get_units(5), 1;        // print the average of 5 readings from the ADC minus tare weight (not set) divided
  scale.set_scale(393.95f);     // corectie celula greutate

  scale.tare();                 // resetare cantar 0
  scale.read();                 // print a raw reading from the ADC
  scale.read_average(20);       // print the average of 20 readings from the ADC

}

void loop() {

  int readData = DHT.read22(D7);
  float temp = DHT.temperature;
  float humidity = DHT.humidity;
  float batteryStatus = getBatteryStatus();
  float weight = scale.get_units();

  Serial.print("Temperatura exterioara: ");
  Serial.println(temp);
  Serial.print("Umiditate exterioara: ");
  Serial.println(humidity);
  Serial.print("Presiune atmosferica: ");
  Serial.println(barometru.readPressure() / 100);
  Serial.print("Procent baterie: ");
  Serial.println(batteryStatus);
  Serial.print("Greutate: ");
  Serial.println(weight);

  delay(10000);

}

iar pe serial imi afiseaza

Citat

12:01:24.605 -> Temperatura exterioara: 23.90
12:01:24.605 -> Umiditate exterioara: 38.90
12:01:24.605 -> Presiune atmosferica: 1011.93
12:01:24.605 -> Procent baterie: 99.17
12:01:24.605 -> Greutate: 0.14

 

 

Editat de piratu2ro
Link spre comentariu

 

12 minutes ago, piratu2ro said:

scale.get_units(5), 1; // print the average of 5 readings from the ADC minus tare weight (not set) divided

Ce-i cu linia asta in InitScale() ?
Eu ti-am zis mai sus sa nu mai faci copy/paste la tot felul de bazaconii de pe net.
Vad ca user @Bandi Szaszare chef sa te ajute.
Ia-o incet, si unde nu pricepi, eu zic sa apelezi la el.

 

Editat de Vizitator
Link spre comentariu

Da ma ajuta si incerc sa fac ce imi zice el, astea le-am facut cum erau in vechiul program, m-am uitat acum pe niste exemple cu hx711 si am modificat

void InitScale () {
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
  scale.set_scale(393.95f);     // corectie celula greutate
  scale.tare();                 // resetare cantar 0

}

 

Editat de piratu2ro
Link spre comentariu

Salut,

  De obicei e ok sa te uiti la documentatia originala a librariei pentru ca ai si explicatii si diferite exemple pentru hx711 este https://github.com/bogde/HX711.

  A doua varianta a InitScale acuma pare ok, acel "get_units" nu avea nici un sens in Init pentru ca nu face altceva decat citeste cantarul care e total inutil in etapa de initializare.

  

  Pasul urmator e sa ne pregatim de deepSleep care inseamna ca trebuie sa rezolvam partea de resetare la 0. Eu am intrat in librarie si m-am uitat ce face functia "scale.tare()" (poti vedea si tu aici https://github.com/bogde/HX711/blob/master/src/HX711.cpp ) si nu face altceva decat face cateva citiri si dupa apeleaza cu valoarea obtinuta functia "set_offset". Acuma ca stim ca valoarea de calibrare este stocata prin functia "set_offset" si putem accesa valoarea respectiva prin "get_offset" putem face o calibrare manuala cand dorim noi.

 

  Pentru partea de calibrare avem nevoie de o alta functie ( tip void) ceva de genul "calibrateScale" in care verificam o conditie, conditia cea mai simpla ar fi o apasare de buton, cand apasam butonul citim valoarea de calibrare prin "get_offset" si o stocam undeva ( stocarea putin mai tarziu).

 

  Asa ca pentru moment pasul urmator:

 

   1. Functia noua "calibrateScale" pe care il si apelezi din functia "loop" dupa acele serial.println-uri.

   2. In functie faci o conditie "if" prin care verifici daca un anumit buton este apasat ( exemplu aici https://randomnerdtutorials.com/esp8266-nodemcu-digital-inputs-outputs-arduino/)

   3. In conditia If ( din exemplu partea de "if (buttonState == HIGH)", partea cu "else" nu ne intereseaza pentru ca nu facem nimic daca butonul nu este apasat), apelezi metoda "get_offset" si stochezi valoarea intr-o variabila ( daca te uiti in implementare o sa vezi ca returneaza o variabila de tip "long") mai apoi scrii in consola valoarea respectiva.

 

  Daca implementezi totul cum trebuie la apasarea butonului va trebuii ca in consola sa apara valoarea de calibrare pe care mai apoi il si stocam in EEPROM ca sa nu-l pierdem dupa deepSleep.

 

 

Spor

Link spre comentariu
37 minutes ago, Bandi Szasz said:

acel "get_units" nu avea nici un sens in Init

Problema nu era ca get_units() era in init , ci ca linia era:
scale.get_units(5) , 1;

Merge si asa , nu asta este problema. Compilator accepta.

Dar:
Pe net exista chiar discutii daca este corect:
float unit = scale.get_units(5) , 1;  

A facut cineva copy/paste la parametrii de la println() si este plin netul cu astfel de exemple... :)

Scuze de putin offtopic.
 

 

Link spre comentariu

acum m-am inpotmolit, am incecat sa fac ceva, dar nu imi afiseaza nimic cand apasa butonul, atasez ce am facut

#include <Adafruit_BMP280.h>
#include <dht.h>
#include <SPI.h>
#include "HX711.h"

const int LOADCELL_DOUT_PIN = D5;
const int LOADCELL_SCK_PIN = D6;
const int buttonPin = D8;

dht DHT;
HX711 scale;
Adafruit_BMP280 barometru;

int offset = -200; // corectie citire tensiune baterie
int buttonState = 0;

void setup() {
  Serial.begin(115200);
  delay(10);
  if (! barometru.begin(0x76 )) {
    Serial.println("Lipsa senzor BMP280, Verifica cablaj!");
    while (1);
  }
  InitScale ();
}

float getBatteryStatus() {
  int volt = analogRead(A0);  // pin citire tensiune
  double voltage = map(volt, 0, 1023, 0, 2500) + offset; // map 0-1023 la 0-2500 si factor de corectie
  voltage /= 100;                                        // mv --> V

  float diviziune = (3.7 - 2.5) / 100  ;
  float procent = (voltage - 2.5) / diviziune;
  procent = constrain(procent, 0, 100);
  return  procent;

}

void InitScale () {
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
  scale.set_scale(393.95f);     // corectie celula greutate
  scale.tare();                 // resetare cantar 0

}

void calibrateScale (){
  if (buttonState == HIGH) {
  scale.get_offset ();
    
  }
  
}

void loop() {

  int readData = DHT.read22(D7);
  float temp = DHT.temperature;
  float humidity = DHT.humidity;
  float batteryStatus = getBatteryStatus();
  float weight = scale.get_units();

  Serial.print("Temperatura exterioara: ");
  Serial.println(temp);
  Serial.print("Umiditate exterioara: ");
  Serial.println(humidity);
  Serial.print("Presiune atmosferica: ");
  Serial.println(barometru.readPressure() / 100);
  Serial.print("Procent baterie: ");
  Serial.println(batteryStatus);
  Serial.print("Greutate: ");
  Serial.println(weight);

  calibrateScale ();

  delay(10000);

}

 

Link spre comentariu

Ok, hai sa le luam pe rand atunci sa intelegi care e treaba si cu butoanele:

 

  1. Trebuie definit un PIN ca intrare asta se face prin "pinMode(buttonPin, INPUT_PULLUP);

  2. Cand vrei sa citesti starea butonului trebuie apelat "digitalRead(buttonPin)" care returneaza HIGH daca pe pin este prezent tensiunea de 3.3V din pull-up sau LOW daca ai apasat butonul si acesta trage pin-ul la masa.

 

  Ce ai gresit tu este ca nu ai definit un pin ca input si nu ai copiat nici "digitalRead" din exemplu. Ar trebuii sa arate ceva de genul acesta codul considerand butonul legat intre GPIO4 si GND:

  • Am pus definirea pinului de intrare in setup linia 21 si am declarat variabila "buttonPin" in care am asignat pinul 4 ca intrare
  • Am adaugat citirea digitalRead in functie.
  • Am citit "get_offset" si am salvat valoarea in variabila "offset"
  • Am printat valoarea in consola

 

#include <Adafruit_BMP280.h>
#include <dht.h>
#include <SPI.h>
#include "HX711.h"

const int LOADCELL_DOUT_PIN = D5;
const int LOADCELL_SCK_PIN = D6;
const int buttonPin = D8;

dht DHT;
HX711 scale;
Adafruit_BMP280 barometru;

int offset = -200; // corectie citire tensiune baterie
int buttonState = 0;
const int buttonPin = 4; // intrarea butonului pe GPIO4

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

  pinMode(buttonPin, INPUT_PULLUP) // definim GPIO4 ca intrare;

  if (! barometru.begin(0x76 )) {
    Serial.println("Lipsa senzor BMP280, Verifica cablaj!");
    while (1);
  }
  InitScale ();
}

float getBatteryStatus() {
  int volt = analogRead(A0);  // pin citire tensiune
  double voltage = map(volt, 0, 1023, 0, 2500) + offset; // map 0-1023 la 0-2500 si factor de corectie
  voltage /= 100;                                        // mv --> V

  float diviziune = (3.7 - 2.5) / 100  ;
  float procent = (voltage - 2.5) / diviziune;
  procent = constrain(procent, 0, 100);
  return  procent;

}

void InitScale () {
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
  scale.set_scale(393.95f);     // corectie celula greutate
  scale.tare();                 // resetare cantar 0

}

void calibrateScale () {
  buttonState = digitalRead(buttonPin); // citim pin-ul de intrare
  
  if (buttonState == LOW) { // Aici trb LOW pentru a detecta butonul apasat am gresit eu initial cand am zis de HIGH
    long offset = scale.get_offset();
    Serial.print("Calib offset: ");
    Serial.println(offset);
  }
}

void loop() {

  int readData = DHT.read22(D7);
  float temp = DHT.temperature;
  float humidity = DHT.humidity;
  float batteryStatus = getBatteryStatus();
  float weight = scale.get_units();

  Serial.print("Temperatura exterioara: ");
  Serial.println(temp);
  Serial.print("Umiditate exterioara: ");
  Serial.println(humidity);
  Serial.print("Presiune atmosferica: ");
  Serial.println(barometru.readPressure() / 100);
  Serial.print("Procent baterie: ");
  Serial.println(batteryStatus);
  Serial.print("Greutate: ");
  Serial.println(weight);

  calibrateScale();

  delay(250);

}

 

 

Acum ar trebuii sa mearga, daca merge atunci iti arat si cum se lucreaza cu EEPROM pentru a salva date ce nu trebuie sa se piarda dupa deepSleep.

 

Editat de Bandi Szasz
Link spre comentariu

Multumesc mult,

 

Definisem si eu la linia 8, D8  ca intrare , am sters si am lasat D4 ca intrarea butonului pe , pe GIPO 5 Si GIPO 4 am barometrul.

Am incarcat programul si functioneaza, dar am observat ca cu delay 250 imi scrie pe serial un print bun si unul nu, la senzorul dht, Daca modific la 500 scrie ok,

si mai am o intrebare, in loop la 65 ,

 float weight = scale.get_units(); e ok asa sau

 float weight = scale.get_units(10);

 

 

Citat

07:27:44.854 -> Temperatura exterioara: 25.60
07:27:44.854 -> Umiditate exterioara: 41.70
07:27:44.854 -> Presiune atmosferica: 1001.77
07:27:44.854 -> Procent baterie: 100.00
07:27:44.854 -> Greutate: -0.31
07:27:45.116 -> Temperatura exterioara: -999.00
07:27:45.116 -> Umiditate exterioara: -999.00
07:27:45.116 -> Presiune atmosferica: 1001.78
07:27:45.116 -> Procent baterie: 100.00
07:27:45.116 -> Greutate: -0.24
07:27:45.379 -> Temperatura exterioara: 25.60
07:27:45.379 -> Umiditate exterioara: 41.70
07:27:45.379 -> Presiune atmosferica: 1001.79
07:27:45.379 -> Procent baterie: 100.00
07:27:45.379 -> Greutate: -0.44

 

 

Link spre comentariu

Ok, eu pusesem 250ms sa mearga putin mai fluent apasarea butonului insa oricum la final renuntam la delay.  Diferenta intre "scale.get_units()" si "scale.get_units(10)" este numarul de citiri efectuate, fara sa ii dai un numar el citeste senzorul cantarului o singura data iar daca ii dai un numar ( in cazul tau 10) atunci el va face 10 citiri consecutive si va calcula media. De obicei e bine sa faci mai multe citiri pentru a marii percizia, cu o singura citire poate din cand in cand iti va da o valoare mai eronata insa daca faci 5-10 citiri atunci o citire mai eronata va avea mai putin impact pe langa celalale 9 citiri corecte. Acum valoarea ideala doar tu o poti afla jucandute cu diferite valori si sa vezi daca obtii cititi consecutive mai precise in idea sa nu iti dea valori de genu 0.4kg - 0.42kg - 0.39kg,etc.. ci sa fie cat de cat stabile, insa undeva intre 5-10 e ok, eu la citiri prin ADC de obicei fac 10 citiri.

 

Sa postezi ultima bucata de cod pe care l-ai modificat sa iti arat pe ultima versiune cum se salveaza valori in EEPROM.

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări