|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.88 Kraj: Dobrepolje
|
Objavljeno: Sre Jul 12, 2023 3:14 pm Naslov sporočila: Ob izpadu modema se ESP ne poveže |
|
|
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 |
|
|
mosqito Član
Pridružen-a: Čet 07 Apr 2016 23:22 Prispevkov: 3246 Aktiv.: 33.09
|
Objavljeno: Sre Jul 12, 2023 3:37 pm Naslov sporočila: |
|
|
Eno vprašanje: zakj pa nimaš vsega na esp-ju? _________________ Always going the extra mile. |
|
Nazaj na vrh |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.88 Kraj: Dobrepolje
|
Objavljeno: Čet Jul 13, 2023 12:16 am Naslov sporočila: |
|
|
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 |
|
|
mosqito Član
Pridružen-a: Čet 07 Apr 2016 23:22 Prispevkov: 3246 Aktiv.: 33.09
|
Objavljeno: Čet Jul 13, 2023 7:38 am Naslov sporočila: |
|
|
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 |
|
|
Proteus Član
Pridružen-a: Sre 15 Jun 2005 10:03 Prispevkov: 1791 Aktiv.: 8.03
|
Objavljeno: Čet Jul 13, 2023 11:07 am Naslov sporočila: |
|
|
Č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 |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.88 Kraj: Dobrepolje
|
Objavljeno: Čet Jul 13, 2023 12:03 pm Naslov sporočila: |
|
|
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 |
|
|
mato1111 Član
Pridružen-a: Pet 28 Dec 2012 14:42 Prispevkov: 612 Aktiv.: 4.44 Kraj: Vrhnika
|
Objavljeno: Čet Jul 13, 2023 8:34 pm Naslov sporočila: |
|
|
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 |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.88 Kraj: Dobrepolje
|
Objavljeno: Čet Jul 13, 2023 8:49 pm Naslov sporočila: |
|
|
@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 |
|
|
đzuro Član
Pridružen-a: Čet 22 Maj 2014 17:09 Prispevkov: 47 Aktiv.: 0.39 Kraj: Ljubljana
|
Objavljeno: Pet Jul 14, 2023 8:46 am Naslov sporočila: |
|
|
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 |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.88 Kraj: Dobrepolje
|
Objavljeno: Ned Jul 16, 2023 3:54 pm Naslov sporočila: |
|
|
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 |
|
|
đzuro Član
Pridružen-a: Čet 22 Maj 2014 17:09 Prispevkov: 47 Aktiv.: 0.39 Kraj: Ljubljana
|
Objavljeno: Ned Jul 16, 2023 4:20 pm Naslov sporočila: |
|
|
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 |
|
|
marko11 Član
Pridružen-a: Ned 14 Dec 2003 17:47 Prispevkov: 866 Aktiv.: 3.88 Kraj: Dobrepolje
|
Objavljeno: Tor Jul 18, 2023 1:13 pm Naslov sporočila: |
|
|
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 |
|
|
mato1111 Član
Pridružen-a: Pet 28 Dec 2012 14:42 Prispevkov: 612 Aktiv.: 4.44 Kraj: Vrhnika
|
Objavljeno: Tor Jul 18, 2023 7:11 pm Naslov sporočila: |
|
|
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 |
|
|
Proteus Član
Pridružen-a: Sre 15 Jun 2005 10:03 Prispevkov: 1791 Aktiv.: 8.03
|
Objavljeno: Sre Jul 19, 2023 9:35 am Naslov sporočila: |
|
|
Ž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 |
|
|
mosqito Član
Pridružen-a: Čet 07 Apr 2016 23:22 Prispevkov: 3246 Aktiv.: 33.09
|
Objavljeno: Sre Jul 19, 2023 10:37 am Naslov sporočila: |
|
|
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 |
|
|
|
|
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
|