www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Ob izpadu modema se ESP ne poveže
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.88
Kraj: Dobrepolje

PrispevekObjavljeno: Sre Jul 12, 2023 3:14 pm    Naslov sporočila:  Ob izpadu modema se ESP ne poveže Odgovori s citatom

Hi

S spodnjim programom pošiljam podatke na ThingSpeak. To deluje vse OK.

Problem pa se zgodi, ko na primer zmanjka elektrike, ali kakorkoli izpade WiFi povezava na modemu.

Problem se zgodi, ko ponovno pride do elektrike oziroma se vzpostavi WiFi povezava, takrat pa se Arduino ne poveže.

Ne vem kako bi moral spremeniti program, da se ob ponovni vklopitvi modema Arduino zopet poveže.

Opazil sem, če bi se modem hitreje vzpostavil, kot Arduino plato, bi se povezava vzpostavila.

Če izklopim Arduino plato in jo ponovno vklopim se vedno poveže in pošilja podatke.

Prosim za kakršen koli nasvet, kako posodobiti program.

Lp,marko


Koda:




#include <SoftwareSerial.h>
SoftwareSerial esp(2,3);
 
#define DEBUG true
#define IP "184.106.153.149"// thingspeak.com ip
String Api_key = "GET /update?key=52UDLNCXXXXXXXXXXX"; //change it with your api key like "GET /update?key=Your Api Key"

int error;
float output; 

long writingTimer = 900;   //(  60 sek, 1 minuta)
long startTime = 0;
long waitTime = 0;

// ------------------- DS18b20 --------------------
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS_1   5  // številka digitalnega pina na Arduimo
OneWire oneWire_zunaj(ONE_WIRE_BUS_1);
DallasTemperature sensors_zunaj(&oneWire_zunaj);
float tempZunaj;

// ------------------- BMP280 -------------------------------
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#define BMP280_I2C_ADDRESS  0x76
//Setup connection of the sensor
Adafruit_BMP280 bmp; // I2C

//Variables
float pressure;    //To store the barometric pressure (Pa)
float temperature;  //To store the temperature (oC)
int altimeter;    //To store the altimeter (m) (you can also use it as a float variable)

float tlak;
float visina = 469;
float a;
float x;
float y;


// ------------------------------------------------------------

void setup()
{
  Serial.begin(9600);
  esp.begin(9600);
//  pinMode(sensor_pin,INPUT);
 
  bmp.begin();
  Serial.println("Adafruit BMP280 zracni tlak, temperatura:");
    if (!bmp.begin(BMP280_I2C_ADDRESS))
  { 
    Serial.println("Could not find a valid BMP280 sensor, check wiring!");
    while (1);
  }
  Serial.println("Dallas Temperature DS18b20");
  sensors_zunaj.begin();  //
 
  send_command("AT+RST\r\n", 2000, DEBUG); //reset module
  send_command("AT+CWMODE=1\r\n", 1000, DEBUG); //set station mode
  send_command("AT+CWJAP=\"xxxx\",\"yyyyyyyyy\"\r\n", 2000, DEBUG);   //connect wifi network
  while(!esp.find("OK")) { //wait for connection
  Serial.println("Connected");}

  beriSenzorDS18b20();
  beriSenzorBMP280();
  updatedata();

 
}

void loop()
{

 
  waitTime = millis()-startTime;   
  if (waitTime > (writingTimer*1000))
  {
  pretvoriTlak();
  beriSenzorDS18b20();
  beriSenzorBMP280();

  start: //label
  error=0;
  updatedata();
  if (error==1){
    goto start; //go to label "start"
  }
    startTime = millis();
  }
 
}

// -------------------------- beri senzor DS18b20 -------------------------
void beriSenzorDS18b20(){
 
  sensors_zunaj.requestTemperatures(); // Send the command to get temperatures
 
  Serial.print(sensors_zunaj.getTempCByIndex(0)); // 0 refers to the first IC on the wire
  Serial.print(" Temp. DS18b20 : ");
  Serial.println(sensors_zunaj.getTempCByIndex(0));
   tempZunaj = (sensors_zunaj.getTempCByIndex(0));
  delay(1000);
 
}
// ------------------------- the end -------------------------------------

void beriSenzorBMP280(){

  //Read values from the sensor:
  pressure = bmp.readPressure();
  pressure = (pressure/100);
  temperature = bmp.readTemperature();
  altimeter = bmp.readAltitude (1013.35); //
 
  //Print values to serial monitor:
  Serial.print(F("Pressure: "));
    Serial.print(pressure);
   
    Serial.print(" hPa");
    Serial.print("\t");
    Serial.print(("Temp: "));
    Serial.print(temperature);
    Serial.print(" oC");
    Serial.print("\t");
    Serial.print("Altimeter: ");
    Serial.print(altimeter); // this should be adjusted to your local forcase
    Serial.println(" m");
 
}
// ------------------------ the end -------------------------


void pretvoriTlak(){

// preračuna iz dejanskega  zračnega tlaka(965,25 hPa ) na nadmorski višini 469m,
// v NORMALIZIRAN zračni tlak (1020,38 mBar)

a = (pressure - 0.3);
x = (visina / pow(a,0.190284));
y = (1 + (0.000084229 * x));
tlak = a * pow(y,5.255302);

 Serial.print(tlak);
 Serial.println(" mBar");
 delay(2000);
}
// --------------------- the end ----------------------------

void updatedata(){
  String command = "AT+CIPSTART=\"TCP\",\"";
  command += IP;
  command += "\",80";
  Serial.println(command);
  esp.println(command);
  delay(2000);
  if(esp.find("Error")){
    return;
  }
 
  command = Api_key ;
  command += "&field1=";   
  command += tempZunaj;     
  command += "&field2=";   
  command += tlak;           //pressure;   
  command += "\r\n";
  Serial.print("AT+CIPSEND=");
  esp.print("AT+CIPSEND=");
  Serial.println(command.length());
  esp.println(command.length());
  if(esp.find(">")){
    Serial.print(command);
    esp.print(command);
  }
  else{
   
   Serial.println("AT+CIPCLOSE");
   esp.println("AT+CIPCLOSE");
    //Resend...
    error=1;
  }
  }

String send_command(String command, const int timeout, boolean debug)
{
  String response = "";
  esp.print(command);
  long int time = millis();
  while ( (time + timeout) > millis())
  {
    while (esp.available())
    {
      char c = esp.read();
      response += c;
    }
  }
  if (debug)
  {
    Serial.print(response);
  }
  return response;
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
mosqito
Član
Član



Pridružen-a: Čet 07 Apr 2016 23:22
Prispevkov: 3246
Aktiv.: 33.09

PrispevekObjavljeno: Sre Jul 12, 2023 3:37 pm    Naslov sporočila:   Odgovori s citatom

Eno vprašanje: zakj pa nimaš vsega na esp-ju?
_________________
Always going the extra mile.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.88
Kraj: Dobrepolje

PrispevekObjavljeno: Čet Jul 13, 2023 12:16 am    Naslov sporočila:   Odgovori s citatom

mosqito je napisal/a:
Eno vprašanje: zakj pa nimaš vsega na esp-ju?


Imam ESP8266 in Mega ploščo. Pride še nekaj senzorjev, Oled zaslon, ura ....

Pa še vedno me zanima kako vspostaviti vezo, ko pride do izpada modema.

Hvala za vsak nasvet,

lp,
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
mosqito
Član
Član



Pridružen-a: Čet 07 Apr 2016 23:22
Prispevkov: 3246
Aktiv.: 33.09

PrispevekObjavljeno: Čet Jul 13, 2023 7:38 am    Naslov sporočila:   Odgovori s citatom

Ena možnost je, da narediš nek mehanizem watchdoga. Če se povezava izgubi, po nekem timeoutu aktiviraj reset. S tem sicer lahko ustvariš neskončno zanko, v kateri se cikla, zato je dobro, da pred resetom nekam zapisuješ (flash/eeprom), da si ti resetiral in ni bil dejanski hardverski reset. S tem imaš potem malo več nadzora.
_________________
Always going the extra mile.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Proteus
Član
Član



Pridružen-a: Sre 15 Jun 2005 10:03
Prispevkov: 1791
Aktiv.: 8.03

PrispevekObjavljeno: Čet Jul 13, 2023 11:07 am    Naslov sporočila:   Odgovori s citatom

Če kaj, potem mi tole za gotovo ni všeč in to iz dveh razlogov:
- uporaba GOTO ... resno???
- če je kaj narobe boš forever obtičal v tej zanki, brez da bi vedel kaj je narobe.

Koda:
  start: //label
  error=0;
  updatedata();
  if (error==1){
    goto start; //go to label "start"
  }
    startTime = millis();
  }
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.88
Kraj: Dobrepolje

PrispevekObjavljeno: Čet Jul 13, 2023 12:03 pm    Naslov sporočila:   Odgovori s citatom

Proteus je napisal/a:
Če kaj, potem mi tole za gotovo ni všeč in to iz dveh razlogov:
- uporaba GOTO ... resno???
- če je kaj narobe boš forever obtičal v tej zanki, brez da bi vedel kaj je narobe.

Koda:
  start: //label
  error=0;
  updatedata();
  if (error==1){
    goto start; //go to label "start"
  }
    startTime = millis();
  }


Tole sem pobrisal, sedaj zaenkrat deluje, se poveže z modemom, ko se modem ponovno vklopi.

@proteus, hvala.


Imam še ENO vprašanje:

Na ThingSpeak bi rad poslal spremenljivko /pressure/ brez decimalk

in spremenljivko /tempZunaj/ z eno decimalko. Pa ne vem kako in kje v programu se to napiše, ker sedaj se obe spremenljivki izpišeta z dvema decimalkama.

lp,marko
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
mato1111
Član
Član



Pridružen-a: Pet 28 Dec 2012 14:42
Prispevkov: 612
Aktiv.: 4.44
Kraj: Vrhnika

PrispevekObjavljeno: Čet Jul 13, 2023 8:34 pm    Naslov sporočila:   Odgovori s citatom

Citiram:
Opazil sem, če bi se modem hitreje vzpostavil, kot Arduino plato, bi se povezava vzpostavila.

Jaz sem to na začetku reševal tako, da sem ob vklopu ESP dodal 2-3 min "pavze" da se je modem vedno prej vzpostavil.

Če izklopiš samo modem in ga čez nekaj časa vklopiš nazaj pa se ti ESP samodejno ponovno poveže?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.88
Kraj: Dobrepolje

PrispevekObjavljeno: Čet Jul 13, 2023 8:49 pm    Naslov sporočila:   Odgovori s citatom

@mato1111 sem že @Proteus-u odgovoril, da sedaj zaenkrat deluje, hvala.



Imam še ENO vprašanje:

Na ThingSpeak bi rad poslal spremenljivko /pressure/ brez decimalk

in spremenljivko /tempZunaj/ z eno decimalko. Pa ne vem kako in kje v programu se to napiše, ker sedaj se obe spremenljivki izpišeta z dvema decimalkama.

lp,
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
đzuro
Član
Član



Pridružen-a: Čet 22 Maj 2014 17:09
Prispevkov: 47
Aktiv.: 0.39
Kraj: Ljubljana

PrispevekObjavljeno: Pet Jul 14, 2023 8:46 am    Naslov sporočila:   Odgovori s citatom

v Funkciji void updatedata(){

naredi pretvorbo spremenljivke v želeni zapis npr:
String strPressure = String((int)pressure);

za /tempZunaj/ z eno decimalko bi takole naredil:
String strTempZunaj = String(tempZunaj, 1);

in to novo spremenljivko kličeš spodaj v klicu:

command += strPressure;
command += strTempZunaj;

_________________
Izobražen je tisti človek, ki ve, kje bo našel tisto, česar ne ve
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.88
Kraj: Dobrepolje

PrispevekObjavljeno: Ned Jul 16, 2023 3:54 pm    Naslov sporočila:   Odgovori s citatom

Hi

Prosim, če mi kdo razloži kaj pomeni:

Kaj pomeni \t
Koda:

Serial.print("Novo stanje: \t\t");


Kaj pomeni (F (" ")

Koda:

Serial.print(F(" Temperatura : ");



Ka j pomeni \r\n

Koda:

comand += " \r\n ";


Ali je mogoče kje na internetu kaj napisanega o teh zadevah? saj je v raznih programih še veliko različnih ukazov.

lp, marko
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
đzuro
Član
Član



Pridružen-a: Čet 22 Maj 2014 17:09
Prispevkov: 47
Aktiv.: 0.39
Kraj: Ljubljana

PrispevekObjavljeno: Ned Jul 16, 2023 4:20 pm    Naslov sporočila:   Odgovori s citatom

marko11 je napisal/a:
Hi

Prosim, če mi kdo razloži kaj pomeni:

Kaj pomeni \t
Koda:

Serial.print("Novo stanje: \t\t");


Kaj pomeni (F (" ")

Koda:

Serial.print(F(" Temperatura : ");



Ka j pomeni \r\n

Koda:

comand += " \r\n ";


Ali je mogoče kje na internetu kaj napisanega o teh zadevah? saj je v raznih programih še veliko različnih ukazov.

lp, marko



\t: \t je escape-sekvenca, ki predstavlja vstavljanje tabulatorja v niz znakov. V vašem primeru se uporablja za ustvarjanje večje poravnave v izpisu.

(F(" ")): makro F omogoča shranjevanje niza v pomnilniku programa, namesto v pomnilniku podatkov.

\r\n: \r in \n sta dve escape-sekvenci, ki predstavljata "vračilo koraka" in "nova vrstica" v nizu znakov. \r predstavlja premik kurzorja na začetek vrstice, medtem ko \n predstavlja premik kurzorja na naslednjo vrstico.
V vašem primeru se \r\n uporablja za dodajanje prazne vrstice v niz command.

Arduino dokumentacija: https://www.arduino.cc/reference/en/

_________________
Izobražen je tisti človek, ki ve, kje bo našel tisto, česar ne ve
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Član
Član



Pridružen-a: Ned 14 Dec 2003 17:47
Prispevkov: 866
Aktiv.: 3.88
Kraj: Dobrepolje

PrispevekObjavljeno: Tor Jul 18, 2023 1:13 pm    Naslov sporočila:   Odgovori s citatom

Hi

Kako dolg je lahko kabel do senzorja BMP280 in ali je dober UTP kabel?
Na splošno, kako so lahko dolgi kabli za I2C komunikacijo?

Lp,
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
mato1111
Član
Član



Pridružen-a: Pet 28 Dec 2012 14:42
Prispevkov: 612
Aktiv.: 4.44
Kraj: Vrhnika

PrispevekObjavljeno: Tor Jul 18, 2023 7:11 pm    Naslov sporočila:   Odgovori s citatom

Naj bi bil čim krajši.
Pogojeno je s kapacitivnostjo vodila in hitrostjo prenosa podatkov. Nižja hitrost daljši je lahko kabel.
Do 30 cm je meni vedno delovalo normalno, daljše razdalje pa nisem imel - preizkusi.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Proteus
Član
Član



Pridružen-a: Sre 15 Jun 2005 10:03
Prispevkov: 1791
Aktiv.: 8.03

PrispevekObjavljeno: Sre Jul 19, 2023 9:35 am    Naslov sporočila:   Odgovori s citatom

Že v osnovi je I2C komunikacija namenjena kratkim razdaljam znotraj ene elektronske naprave ali med več IC-ji na istem PCB.

Parametri, ki vplivajo na dolžino povezave so poznani n.pr. hitrost komunikacije (višje hitrosti krajša razdalja), kapacitivnost povezave (primerni so kabli s čim nižjo kapacitivnostjo), električni šumi in motnje v okolju (doma n.pr. dela na terenu pa podivja, ker je poleg n.pr. kakšen frekvenčnik), itd..

Skratka daljši, kot je kabel bolj posiljuješ napravo, da deluje v okolju za katerega ni namenjena. Sicer pa pravilo prsta je največ kakšen meter.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
mosqito
Član
Član



Pridružen-a: Čet 07 Apr 2016 23:22
Prispevkov: 3246
Aktiv.: 33.09

PrispevekObjavljeno: Sre Jul 19, 2023 10:37 am    Naslov sporočila:   Odgovori s citatom

Jaz ponavadi naredim lokalno na I2C, potem pa naprej največkrat na RS485 (dif. par) ali CAN, če je razdalja malo daljša. Po izkušnjah je do cca. 50cm tudi I2C OK, če daš malo manjše pullup upore (1k) in uporabiš manjšo hitrost SCL - 100kHz
_________________
Always going the extra mile.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 79 dni


Powered by phpBB © 2001, 2005 phpBB Group