ESP8266 a millis misto delay

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
unyhhox
Příspěvky: 41
Registrován: 19 bře 2018, 11:11
Reputation: 0

Re: ESP8266 a millis misto delay

Příspěvek od unyhhox » 14 říj 2022, 11:03

ondraN píše:
14 říj 2022, 10:54
Jestli jsem dobře pochopil ten poslední program, tak při více než 51,8V zapínáš FV přes invertor a při méně než 51V vypínáš? O kolik poklesne napětí na bodě, kde měříš napětí při zapnutí a zatížení invertoru? Je to opravdu takhle zamýšleno?
Tyto hodnoty byly původně 53.1 zapnutí a 51.5 vypnutí. Včera jsem ty hodnoty musel snížit, protože baterie byla vybita a potřeboval jsem ten kód otestovat. Ať už je napětí 53.1 a 51.5 nebo 51.8 a 51 tak v obou případech to dělá to stejné. Mereni napeti je přímo na baterii, takže to ovlivnuje jen pokles na samotné baterii. Pokud sepne stykac měniče, tak 8s prodleva, není žádné napětí na vystupu a az po cca této době se na vystupu objevuje napětí, tzn odepina stykac DS a spina stykac FV. Po sepnutí stykace inverteru je jen minimální proud z baterie, tudíž minimálni ubytek. Úbytek jsem tedy vyloučil.

Kód zapne stykac měniče a 2s na to stykac DS a FV. Místo 12s prodlevy jsou jen cca 2s. Kod jak je očividně porovnává milis od spuštění, což by odpovídalo. Resetnu esp, 10s trva boot, připojení na wifi, pote spina stykac inverteru a 2s na to ostatní stykace. Co s tim?

Diky za rady.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: ESP8266 a millis misto delay

Příspěvek od ondraN » 14 říj 2022, 12:47

Odpoledne na to mrknu, teď není čas na nějaké větší vrtání se v kódu.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: ESP8266 a millis misto delay

Příspěvek od ondraN » 14 říj 2022, 19:29

Tady jsem upravil ten původní kód. Nekontroloval jsem to překladačem, takže není vyloučený překlep. Měří se jen, pokud není v procesu spínání invertoru. Výpisy na Blynk jsem omezil na 1x za sec. Ten podivný výpočet napětí a bojler jsem nechal. Chtělo by to daleko víc úprav, aby to bylo pěkné, ale není čas. Přetečení millis je ošetřené jen do té míry, že je OK pokud neproběhne zapnutí 7999ms před přetečením.

Kód: Vybrat vše

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>


float analog_voltage;   
char auth[] = "xxxxx";
const char *ssid     = "xxxx";
const char *password = "xxxx";
long last_sensor_reading = 0;
long bojlerpower = 0;
const int numReadings = 30;
float readings[numReadings];      // the readings from the analog input
int readIndex = 0;              // the index of the current reading
float total = 0;                  // the running total
float average = 0;                // the average


BlynkTimer timer;


void setup() {
 Serial.begin(115200);
 for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
   Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
      }
  pinMode(13,OUTPUT); //13 D7 (distribution line contactor)
  pinMode(14,OUTPUT); //14 je D5 (PV contactor)
  pinMode(12,OUTPUT); //12 je D6 (inverter)
  pinMode(16,OUTPUT); //16 je D0 (water heater)
  Blynk.begin(auth, ssid, password);
}


void batteryvoltagerele(){
  const unsigned long blynkWritePeriod=1000;
  static unsigned long lastExecutedMillis = millis();
  static unsigned long lastBlynkWrite = millis();
  static bool measure=true;
   unsigned long currentMillis = millis();
  if(measure){
    total = total - readings[readIndex];
    readings[readIndex] = analogRead(A0)* 3.3 / 1023*18.86;
    total = total + readings[readIndex];
    readIndex = readIndex + 1;
    average = total / numReadings; // battery voltage measurement with sampling of 30
     if (readIndex >= numReadings) {
      readIndex = 0;
    }
  }
  if (average>52.6) {
      digitalWrite(12,LOW); // inverter turns on if battery voltage reaches certain point
      measure=false;
      if (currentMillis >=(lastExecutedMillis+8000)){  //8s delay and then switch two contactors
        lastExecutedMillis = currentMillis;
        measure=true;
        digitalWrite(13,LOW); // disconnect distribution line
        delay(40);
        digitalWrite(14,LOW); //connect PV system
    }
 }else if (average<51.5){ // if voltage does not need meet requirements then contactors switch from PV to Distribution line
    digitalWrite(14,HIGH);
    delay(40);
    digitalWrite(13 ,HIGH);
    digitalWrite(12 ,HIGH);
  }
  if(currentMillis >=(lastBlynkWrite+blynkWritePeriod)){
    Blynk.virtualWrite(V5, average);
    Blynk.run();
    lastBlynkWrite=currentMillis;
  }
}

void bojlerssr(){ //if battery is full and house does not need much power then electic water heater is turned on.
if (average>52.8) {
digitalWrite(16,HIGH);}
//if(millis() - bojlerpower >= 120000) {
else if (analog_voltage<52.5) {
digitalWrite(16,LOW);
//bojlerpower = millis();
//digitalWrite(15,LOW);
//if(millis() - bojlerpower >= 120000) {
//digitalWrite(15,HIGH);
//bojlerpower = millis(); }
}}
 
void loop() {
  batteryvoltagerele();
  bojlerssr();
   }

peterple
Příspěvky: 156
Registrován: 22 zář 2021, 20:20
Reputation: 0

Re: ESP8266 a millis misto delay

Příspěvek od peterple » 14 říj 2022, 19:43

ondraN píše:
14 říj 2022, 19:29
Přetečení millis je ošetřené jen do té míry, že je OK pokud neproběhne zapnutí 7999ms před přetečením.
To by ma silne zaujímalo prečo to neurobíš poriadne ale neporiadne? Naschvál?
To je to tak ťažké napísať správne?

Kód: Vybrat vše

 if (currentMillis-lastExecutedMillis >=8000){

unyhhox
Příspěvky: 41
Registrován: 19 bře 2018, 11:11
Reputation: 0

Re: ESP8266 a millis misto delay

Příspěvek od unyhhox » 15 říj 2022, 22:39

ondraN píše:
14 říj 2022, 19:29
Tady jsem upravil ten původní kód. Nekontroloval jsem to překladačem, takže není vyloučený překlep. Měří se jen, pokud není v procesu spínání invertoru. Výpisy na Blynk jsem omezil na 1x za sec. Ten podivný výpočet napětí a bojler jsem nechal. Chtělo by to daleko víc úprav, aby to bylo pěkné, ale není čas. Přetečení millis je ošetřené jen do té míry, že je OK pokud neproběhne zapnutí 7999ms před přetečením.

Kód: Vybrat vše

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>


float analog_voltage;   
char auth[] = "xxxxx";
const char *ssid     = "xxxx";
const char *password = "xxxx";
long last_sensor_reading = 0;
long bojlerpower = 0;
const int numReadings = 30;
float readings[numReadings];      // the readings from the analog input
int readIndex = 0;              // the index of the current reading
float total = 0;                  // the running total
float average = 0;                // the average


BlynkTimer timer;


void setup() {
 Serial.begin(115200);
 for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
   Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
      }
  pinMode(13,OUTPUT); //13 D7 (distribution line contactor)
  pinMode(14,OUTPUT); //14 je D5 (PV contactor)
  pinMode(12,OUTPUT); //12 je D6 (inverter)
  pinMode(16,OUTPUT); //16 je D0 (water heater)
  Blynk.begin(auth, ssid, password);
}


void batteryvoltagerele(){
  const unsigned long blynkWritePeriod=1000;
  static unsigned long lastExecutedMillis = millis();
  static unsigned long lastBlynkWrite = millis();
  static bool measure=true;
   unsigned long currentMillis = millis();
  if(measure){
    total = total - readings[readIndex];
    readings[readIndex] = analogRead(A0)* 3.3 / 1023*18.86;
    total = total + readings[readIndex];
    readIndex = readIndex + 1;
    average = total / numReadings; // battery voltage measurement with sampling of 30
     if (readIndex >= numReadings) {
      readIndex = 0;
    }
  }
  if (average>52.6) {
      digitalWrite(12,LOW); // inverter turns on if battery voltage reaches certain point
      measure=false;
      if (currentMillis >=(lastExecutedMillis+8000)){  //8s delay and then switch two contactors
        lastExecutedMillis = currentMillis;
        measure=true;
        digitalWrite(13,LOW); // disconnect distribution line
        delay(40);
        digitalWrite(14,LOW); //connect PV system
    }
 }else if (average<51.5){ // if voltage does not need meet requirements then contactors switch from PV to Distribution line
    digitalWrite(14,HIGH);
    delay(40);
    digitalWrite(13 ,HIGH);
    digitalWrite(12 ,HIGH);
  }
  if(currentMillis >=(lastBlynkWrite+blynkWritePeriod)){
    Blynk.virtualWrite(V5, average);
    Blynk.run();
    lastBlynkWrite=currentMillis;
  }
}

void bojlerssr(){ //if battery is full and house does not need much power then electic water heater is turned on.
if (average>52.8) {
digitalWrite(16,HIGH);}
//if(millis() - bojlerpower >= 120000) {
else if (analog_voltage<52.5) {
digitalWrite(16,LOW);
//bojlerpower = millis();
//digitalWrite(15,LOW);
//if(millis() - bojlerpower >= 120000) {
//digitalWrite(15,HIGH);
//bojlerpower = millis(); }
}}
 
void loop() {
  batteryvoltagerele();
  bojlerssr();
   }
Pokusil jsem se tvůj opravený kód nahrát, ale tentokrát mám hardwarový problém. Najednou mi ESP umřelo. Přestalo reagovat, ani modrá dioda neproblikla při připojení. Na 3.3V jsem naměřil 0.9V a na 5V pinu 1V. Podezříval jsem, že regulátor je KO, tak jsem ESP napojil přimo na 3.3V zdroj. ESP problikla modra dioda, tak jsem jej připojil k PC, ale PC ho zaznamenalo jako nerozpoznané zařízení. Když jsem šel do správce zařízení, USB porty, tak tam byl USB-serial CH340 (COM5) se žlutým vykřičníkem. V arduino ide tento port ani nevidím. Je možné ho ještě rozchodit nebo je na vyhození a musím koupit další? Díky chlapi

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: ESP8266 a millis misto delay

Příspěvek od ondraN » 18 říj 2022, 09:39

Jestli odešel zdroj, tak to je asi konec. Pokud jseš vybavený na práci s SMD, tak můžeš zkusit opravu, jinak vyhodit a nový. Taky bych se podíval, proč to odešlo. Nepřetěžuješ ten zdroj? Mají relé vlastní napájení? Vyvaruješ se tak opakování kremace ESP.
A v tom programu oprav, prosím, ty if podmínky, jak navrhoval peterple. Pak nebude problém s přetečením millis.

unyhhox
Příspěvky: 41
Registrován: 19 bře 2018, 11:11
Reputation: 0

Re: ESP8266 a millis misto delay

Příspěvek od unyhhox » 19 říj 2022, 11:24

ondraN píše:
18 říj 2022, 09:39
Jestli odešel zdroj, tak to je asi konec. Pokud jseš vybavený na práci s SMD, tak můžeš zkusit opravu, jinak vyhodit a nový. Taky bych se podíval, proč to odešlo. Nepřetěžuješ ten zdroj? Mají relé vlastní napájení? Vyvaruješ se tak opakování kremace ESP.
A v tom programu oprav, prosím, ty if podmínky, jak navrhoval peterple. Pak nebude problém s přetečením millis.
Mám tam 4 channel SSR. Používám z toho 3 channely, ale napájené je mám přímo z 5V zdroje a z ESP posílám jen signály. Přímo z dig. pinu mám ovládané dvě SSR FOTEK 40A, které má v PDF uvedenou spotřebu 4-20mA. Zdroj ESP by měl mít zatížitelnost 1A, a to jsem určitě nepřekročil. Nic jiného z ESP napájené není.

Dnes mi přišly dvě ESP, tak ten kód půjdu hned zkusit.

Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: ESP8266 a millis misto delay

Příspěvek od kiRRow » 19 říj 2022, 14:38

Otázka pro Google : "ESP8226 max pin current"

12mA
The ESP8266 is a 3.3V microcontroller, so its I/O operates at 3.3V as well. The pins are not 5V tolerant, applying more than 3.6V on any pin will kill the chip. The maximum current that can be drawn from a single GPIO pin is 12mA.

Pokud z pinu vemeš 20mA, tak téměř o polovinu překračuješ jeho maximální výstupní proud.

unyhhox
Příspěvky: 41
Registrován: 19 bře 2018, 11:11
Reputation: 0

Re: ESP8266 a millis misto delay

Příspěvek od unyhhox » 19 říj 2022, 14:53

kiRRow píše:
19 říj 2022, 14:38
Otázka pro Google : "ESP8226 max pin current"

12mA
The ESP8266 is a 3.3V microcontroller, so its I/O operates at 3.3V as well. The pins are not 5V tolerant, applying more than 3.6V on any pin will kill the chip. The maximum current that can be drawn from a single GPIO pin is 12mA.

Pokud z pinu vemeš 20mA, tak téměř o polovinu překračuješ jeho maximální výstupní proud.
A sakra. Máš pravdu. Já jsem si myslel ,že minimum je 20. Mohlo to tedy způsobit problém, který mám? Když se mi něco takového stalo u arduina, tak mi jen přestal reagovat ten dany pin.

Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: ESP8266 a millis misto delay

Příspěvek od kiRRow » 19 říj 2022, 15:34

Mohlo se stát cokoliv.

Jestli to chceš zkusit opravit proměř 5V linku a 3.3V linku jestli není ve zkratu, pokud ano - odpájej stabilizátor a proměř znovu,jestli ne tak připoj 5V a zkontroluj jestli je na vstupu stabilizátoru 5V a na jeho výstupu 3.3V - což pochybuji že bude dávat těch 3.3V - viděl bych to na odpálený stabilizátor.

Edit:
Hoď sem schéma zapojení, určitě to bude chtít doplnit nějakýma součástkama pro ochranu procesoru a spolehlivější běh, popř jednodužší opravu.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Axamith, luger a 15 hostů