Jump to content

Båtautomasjon med batteriovervåking og Zigbee


Sjøbliss

Recommended Posts

Der satt den! Det var instancen og startingen som manglet, takk! Så må jeg bare finne ut hvordan jeg viser verdien på webserveren. For dette vil helt sikkert bare gi meg ordet busvoltage:

 

String SendHTML(uint8_t led1stat,uint8_t led2stat){
  String ptr = "<!DOCTYPE html> <html>\n";
  ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
  ptr +="<title>Starthjelp</title>\n";
  ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center; charset: utf-8;}\n";
  ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;} h3 {color: #444444;margin-bottom: 50px;}\n";
  ptr +=".button {display: block;width: 80px;background-color: #e30022db;border: none;color: white;padding: 13px 30px;text-decoration: none;font-size: 25px;margin: 0px auto 35px;cursor: pointer;border-radius: 4px;}\n";
  ptr +=".button-on {background-color: #e30022db;}\n";
  ptr +=".button-on:active {background-color: #34495e;}\n";
  ptr +=".button-off {background-color: #66ff00;}\n";
  ptr +=".button-off:active {background-color: #2c3e50;}\n";
  ptr +="p {font-size: 14px;color: #888;margin-bottom: 10px;}\n";
  ptr +="</style>\n";
  ptr +="</head>\n";
  ptr +="<body>\n";

  ptr +="<h1>Batterispenning</h1>\n";

  ptr +="busvoltage\n";
  ptr +="<h1>Starthjelp</h1>\n";
  ptr +="<h3>Sett hovedbryteren til batteri 2 eller begge, og aktiver releene</h3>\n";

 

 

Redigert av Mastiff (see edit history)
Link to post
Share on other sites

@Mastiff Prøv:

 

ptr +=(float)busvoltage;

 

Usikker på float da jeg har sendt alle som int men verdt et forsøk. Hvis ikke må du gjerne trikse med en int hjelpevariabel som deles på 100 ved visning for å få desimaler.

 

Men for å sende oppdatert verdi til server må den inkluderes i SendHTML-linjen slik jeg forstår det:

 

Dvs den må inn her:

 

String SendHTML(uint8_t led1stat,uint8_t led2stat, float busvoltage)

 

Og så må du sende oppdatert verdi til server:

 

if ((timer + 20000) > millis()) {
  busvoltage = ina219.getBusVoltage_V();

  timer = millis();

  server.send(200, "text/html", SendHTML(LED1status,LED2status, busvoltage));

  }


Red: busvoltage må legges til for de tilsvarende ‘server.send...’ setningene i alle subrutinene også

Redigert av Fantino (see edit history)
Link to post
Share on other sites

Jeg tror det nærmer seg, men det kommer denne på sendene:

 

expected primary-expression before 'float'

 

Edit: Den kommer på alle sendene, som her:

 

String SendHTML(uint8_t led1stat,uint8_t led2stat, float busvoltage)

 

Hvis jeg fjerner float, kommer det istedenfor:

 

'busvoltage' is not a type

 

Redigert av Mastiff (see edit history)
Link to post
Share on other sites

@Mastiff Med forbehold om at jeg misforstår, deklarasjonen float skal kun være med her, altså 

 

String SendHTML(uint8_t led1stat,uint8_t led2stat, float busvoltage)

 

Her defineres også LED status1/2 som uint8_t (unsigned integer 8 bit/1 byte).

 

Når du sender i subrutinene skal ikke ‘float’ være med for da bruker du busvoltage som en variabel (og uint8_t er heller ikke med som du ser), altså slik:

 

server.send(200, "text/html", SendHTML(LED1status,LED2status, busvoltage));

 

Merk at det siste uttrykket er en hel linje, mulig derfor det ble uklart?

 

 

 

Link to post
Share on other sites

Flott, da ble det ingen feilmeldinger og jeg kunne programmere. Men det står "16.39" på linjen under "Batterispenning", uansett om ina219-en er koblet til eller ikke. Jeg prøvde å se om den kunne være feilkoblet ved å programmere inn en vanlig ESP Home som jeg vet fungerer, men det går bare ikke an. Hver gang jeg kobler den Arduino IDE-programmerte ESP-en i en Pi for å prøve det (og jeg har prøvd med flere), så sperrer den USB-bussen på Pi-en eler hindrer den i å starte opp i det hele tatt! Snåle greier.

 

Link to post
Share on other sites

Oops! Her mangler det tydeligvis noe! Jeg har ikke definert pinnene til INA-en! :rolleyes: Eller skal jeg det? Jeg skjønner ikke det ut fra eksemplene. Jeg har oppsett med SDA på 21 g SCL på 22, samme som i ESP-home. Her er hele den jeg har nå, jeg fatter ikke hvor jeg skal definere pinnene:


 

Sitat

 

#include <WebServer.h>
#include "Wire.h"
#include "Adafruit_INA219.h"

/* Put your SSID & Password */
const char* ssid = "Starthjelp";  // Enter SSID here
const char* password = "";  //Enter Password here

/* Put IP Address details */
IPAddress local_ip(192,168,4,1);
IPAddress gateway(192,168,4,1);
IPAddress subnet(255,255,255,0);

WebServer server(80);
Adafruit_INA219 ina219;
uint8_t LED1pin = 16;
bool LED1status = LOW;

uint8_t LED2pin = 17;
bool LED2status = LOW;

float busvoltage = 0;

unsigned long timer;

 void setup() {
  Serial.begin(115200);
  pinMode(LED1pin, OUTPUT);
  pinMode(LED2pin, OUTPUT);

  digitalWrite(LED1pin, HIGH);
  digitalWrite(LED2pin, HIGH);

  WiFi.softAP(ssid, password);
  WiFi.softAPConfig(local_ip, gateway, subnet);
  delay(100);
 
  server.on("/", handle_OnConnect);
  server.on("/led1on", handle_led1on);
  server.on("/led1off", handle_led1off);
  server.on("/led2on", handle_led2on);
  server.on("/led2off", handle_led2off);
  server.onNotFound(handle_NotFound);
 
  server.begin();
  Serial.println("HTTP server started");
  long timer = 0;
  ina219.begin();
}

void loop() {
  server.handleClient();
  if(LED1status)
  {digitalWrite(LED1pin, LOW);}
  else
  {digitalWrite(LED1pin, HIGH);}
 
  if(LED2status)
  {digitalWrite(LED2pin, LOW);}
  else
  {digitalWrite(LED2pin, HIGH);}


if ((timer + 20000) > millis()) {
  busvoltage = ina219.getBusVoltage_V();

  timer = millis();

  }
 
}

void handle_OnConnect() {
  LED1status = LOW;
  LED2status = LOW;
  Serial.println("GPIO4 Status: OFF | GPIO5 Status: OFF");
  server.send(200, "text/html", SendHTML(LED1status,LED2status, busvoltage));
  if ((timer + 20000) > millis()) {
  busvoltage = ina219.getBusVoltage_V();

  timer = millis();

  }
 
}

void handle_led1on() {
  LED1status = HIGH;
  Serial.println("GPIO4 Status: ON");
  server.send(200, "text/html", SendHTML(true,LED2status, busvoltage));
}

void handle_led1off() {
  LED1status = LOW;
  Serial.println("GPIO4 Status: OFF");
  server.send(200, "text/html", SendHTML(false,LED2status, busvoltage));
}

void handle_led2on() {
  LED2status = HIGH;
  Serial.println("GPIO5 Status: ON");
  server.send(200, "text/html", SendHTML(LED1status,true, busvoltage));
}

void handle_led2off() {
  LED2status = LOW;
  Serial.println("GPIO5 Status: OFF");
  server.send(200, "text/html", SendHTML(LED1status,false, busvoltage));
}

void handle_NotFound(){
  server.send(404, "text/plain", "Not found");
}

String SendHTML(uint8_t led1stat,uint8_t led2stat, float busvoltage){
  String ptr = "<!DOCTYPE html> <html>\n";
  ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
  ptr +="<title>Starthjelp</title>\n";
  ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center; charset: utf-8;}\n";
  ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;} h3 {color: #444444;margin-bottom: 50px;}\n";
  ptr +=".button {display: block;width: 80px;background-color: #e30022db;border: none;color: white;padding: 13px 30px;text-decoration: none;font-size: 25px;margin: 0px auto 35px;cursor: pointer;border-radius: 4px;}\n";
  ptr +=".button-on {background-color: #e30022db;}\n";
  ptr +=".button-on:active {background-color: #34495e;}\n";
  ptr +=".button-off {background-color: #66ff00;}\n";
  ptr +=".button-off:active {background-color: #2c3e50;}\n";
  ptr +="p {font-size: 14px;color: #888;margin-bottom: 10px;}\n";
  ptr +=(float)busvoltage;
  ptr +="</style>\n";
  ptr +="</head>\n";
  ptr +="<body>\n";
  ptr +="<h1>Batterispenning</h1>\n";
  ptr +=(busvoltage);
  ptr +="\n";
  ptr +="\n";
  ptr +="<h1>Starthjelp</h1>\n";
  ptr +="<h3>Sett hovedbryteren til batteri 2 eller begge, og aktiver releene</h3>\n";
 
   if(led1stat)
  {ptr +="<p>Rele 1: tilkoblet</p><a class=\"button button-off\" href=\"/led1off\">Koble fra</a>\n";}
  else
  {ptr +="<p>Rele 1: frakoblet</p><a class=\"button button-on\" href=\"/led1on\">Koble til</a>\n";}

  if(led2stat)
  {ptr +="<p>Rele 2: tilkoblet</p><a class=\"button button-off\" href=\"/led2off\">Koble fra</a>\n";}
  else
  {ptr +="<p>Rele 2: frakoblet</p><a class=\"button button-on\" href=\"/led2on\">Koble til</a>\n";}

  ptr +="</body>\n";
  ptr +="</html>\n";
  return ptr;
}

 

 

 

Edit igjen: Jeg tror ikke det skal defineres, jeg fant en tutorial,  https://diyi0t.com/ina219-tutorial-for-arduino-and-esp/ som sa at den skulle kobles på pinne 21 og 22, og den er koblet riktig ifølge den. Så da er det noe annet som ikke er som det skal være. Jeg sverger på at hvis jeg bare får denne til å funke, skal jeg aldri mer sette mine bein i Arduino IDE, annet enn for å bruke nøyaktig samme koden!  :lol:

Redigert av Mastiff (see edit history)
Link to post
Share on other sites

Pinnene til INA tror jeg Adafruit library tar seg av. 21/22 skal være korrekt: INA219 Tutorial for Arduino, ESP8266 and ESP32 (diyi0t.com)

 

Kopler du USB til Pi bare for strømforsyning da? ESP bruker jo USB for seriell kommunikasjon, så ville kommentert ut alle serial-debuggingslinjene og kompilert på nytt for å unngå dette. Antar at den prøver å sende til USB og kanskje jammer av den grunn. Husk å kommentere ut Serial.begin også (kompilator i Arduino ser bort fra alt som står etter '//' så enkelt å kommmentere ut.

 

Har lagt inn noen forslag til endringer i koden under:

 

#include <WebServer.h>
#include "Wire.h"
#include "Adafruit_INA219.h"

/* Put your SSID & Password */
const char* ssid = "Starthjelp";  // Enter SSID here
const char* password = "";  //Enter Password here

/* Put IP Address details */
IPAddress local_ip(192,168,4,1);
IPAddress gateway(192,168,4,1);
IPAddress subnet(255,255,255,0);

WebServer server(80);
Adafruit_INA219 ina219;
uint8_t LED1pin = 16;
bool LED1status = LOW;

uint8_t LED2pin = 17;
bool LED2status = LOW;

float busvoltage = 0;

unsigned long timer;

 void setup() {
  Serial.begin(115200);
  pinMode(LED1pin, OUTPUT);
  pinMode(LED2pin, OUTPUT);

  digitalWrite(LED1pin, HIGH);
  digitalWrite(LED2pin, HIGH);

  WiFi.softAP(ssid, password);
  WiFi.softAPConfig(local_ip, gateway, subnet);
  delay(100);
 
  server.on("/", handle_OnConnect);
  server.on("/led1on", handle_led1on);
  server.on("/led1off", handle_led1off);
  server.on("/led2on", handle_led2on);
  server.on("/led2off", handle_led2off);
  server.onNotFound(handle_NotFound);
 
  server.begin();
  Serial.println("HTTP server started");
  unsigned long timer = 0; //unngå problem med overflow til negative tall
  ina219.begin();
}

void loop() {
  server.handleClient();
  if(LED1status)
  {digitalWrite(LED1pin, LOW);}
  else
  {digitalWrite(LED1pin, HIGH);}
 
  if(LED2status)
  {digitalWrite(LED2pin, LOW);}
  else
  {digitalWrite(LED2pin, HIGH);}


if ((timer + 20000) > millis()) {
  busvoltage = ina219.getBusVoltage_V();

  timer = millis();

  //Sender oppdaterte verdier hvert 20 sekund:

  server.send(200, "text/html", SendHTML(LED1status,LED2status, busvoltage));

 

  }
 
}

void handle_OnConnect() {
  LED1status = LOW;
  LED2status = LOW;
  Serial.println("GPIO4 Status: OFF | GPIO5 Status: OFF");

  busvoltage = ina219.getBusVoltage_V();  //Flyttes _før_ server.send slik at busvoltage er oppdatert før sending

  Serial.print("Bus voltage:  "); Serial.println(busvoltage);  //For debugging, kommenteres ut når OK

  server.send(200, "text/html", SendHTML(LED1status,LED2status, busvoltage));
 

  //fjern de tre linjene under da OnConnect bare kjøres en gang ved oppkopling, dvs trenger ikke timer her, kun i main

  if ((timer + 20000) > millis()) {
  busvoltage = ina219.getBusVoltage_V();

  timer = millis();

  }
 
}

void handle_led1on() {
  LED1status = HIGH;
  Serial.println("GPIO4 Status: ON");
  server.send(200, "text/html", SendHTML(true,LED2status, busvoltage));
}

void handle_led1off() {
  LED1status = LOW;
  Serial.println("GPIO4 Status: OFF");
  server.send(200, "text/html", SendHTML(false,LED2status, busvoltage));
}

void handle_led2on() {
  LED2status = HIGH;
  Serial.println("GPIO5 Status: ON");
  server.send(200, "text/html", SendHTML(LED1status,true, busvoltage));
}

void handle_led2off() {
  LED2status = LOW;
  Serial.println("GPIO5 Status: OFF");
  server.send(200, "text/html", SendHTML(LED1status,false, busvoltage));
}

void handle_NotFound(){
  server.send(404, "text/plain", "Not found");
}

String SendHTML(uint8_t led1stat,uint8_t led2stat, float busvoltage){
  String ptr = "<!DOCTYPE html> <html>\n";
  ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
  ptr +="<title>Starthjelp</title>\n";
  ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center; charset: utf-8;}\n";
  ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;} h3 {color: #444444;margin-bottom: 50px;}\n";
  ptr +=".button {display: block;width: 80px;background-color: #e30022db;border: none;color: white;padding: 13px 30px;text-decoration: none;font-size: 25px;margin: 0px auto 35px;cursor: pointer;border-radius: 4px;}\n";
  ptr +=".button-on {background-color: #e30022db;}\n";
  ptr +=".button-on:active {background-color: #34495e;}\n";
  ptr +=".button-off {background-color: #66ff00;}\n";
  ptr +=".button-off:active {background-color: #2c3e50;}\n";
  ptr +="p {font-size: 14px;color: #888;margin-bottom: 10px;}\n";
  ptr +=(float)busvoltage;
  ptr +="</style>\n";
  ptr +="</head>\n";
  ptr +="<body>\n";
  ptr +="<h1>Batterispenning</h1>\n";
  ptr +=(float)busvoltage;
  ptr +="\n";
  ptr +="\n";
  ptr +="<h1>Starthjelp</h1>\n";
  ptr +="<h3>Sett hovedbryteren til batteri 2 eller begge, og aktiver releene</h3>\n";
 
   if(led1stat)
  {ptr +="<p>Rele 1: tilkoblet</p><a class=\"button button-off\" href=\"/led1off\">Koble fra</a>\n";}
  else
  {ptr +="<p>Rele 1: frakoblet</p><a class=\"button button-on\" href=\"/led1on\">Koble til</a>\n";}

  if(led2stat)
  {ptr +="<p>Rele 2: tilkoblet</p><a class=\"button button-off\" href=\"/led2off\">Koble fra</a>\n";}
  else
  {ptr +="<p>Rele 2: frakoblet</p><a class=\"button button-on\" href=\"/led2on\">Koble til</a>\n";}

  ptr +="</body>\n";
  ptr +="</html>\n";
  return ptr;
}

 

 

Link to post
Share on other sites

La nå merke til at du har lagt inn sending av bus-voltage 2 steder:

 

  ptr +=(float)busvoltage;
  ptr +="</style>\n";
  ptr +="</head>\n";
  ptr +="<body>\n";
  ptr +="<h1>Batterispenning</h1>\n";
  ptr +=(float)busvoltage;

 

Usikker på hensikten? I mitt hode må den nederste stå slik at den kommer under overskriften Batterispenning?

Link to post
Share on other sites

Jeg bruker ikke USB til noe annet enn programmeringen, så kobler jeg den fra og kjører boksen på en av de 12-5V UBEC-strømforsyningene jeg bestilte så mange av.  Den ekstra sendingen er et rent uhell, jeg flyttet den nedover i koden for å få den riktig plassert på webserversiden, og så ble det en ekstra igjen. Jeg har nå lastet opp koden du la inn og fjernet den ekstra sendingen, men fremdeles ser jeg bare 16.39. I tillegg avskyr jeg følgeskader... Jeg hadde en liten kortslutning (en tråd fra en kabel) i opplegget til ESP-en. Ikke nok til at strømforsyningens automatsikring slo ut, men nok til at det ødela to ESP-er, før jeg skjønte hva som foregikk. Og en INI219...

 

Men iallfall, det skjedde ingenting som helst. Jeg ser fremdeles 16.39 i linja under. Jeg lurer på om det kan være en feil på et parti INA219, for jeg får ikke noe når jeg omprogrammerer den til ESPHome heller, et oppsett jeg vet skal fungere. Snålt som f... Jeg må prøve å finne ut av det.

 

Link to post
Share on other sites

Hmm. Jeg ville bare laget en ny liten testfil og limt inn koden du finner nederst i den INA-tutorialen et par innlegg tilbake. Så sjekker du om du får målinger fra INA før du går videre. Jeg holdt på å klippe beina av to innganger på en ADS1115 jeg trodde jeg hadde ødelagt delvis nettopp, men fant ut i siste liten at det bare hadde skjedd en liten feil i faktoren jeg brukte for å regne om 😁

Link to post
Share on other sites

Det er nødt til å være en maskinvarefeil, for samme ESPhome-oppsett som gir volt på den boksen som skal monteres i hekken av båten, gir absolutt ingenting når jeg programmerer det inn i denne. Jeg må gå over loddingene til pinnene på INA-en. Jeg avskyr sånn lodding, det er ufattelig irriterende at ikke de greiene kommer ferdig loddet!

 

Link to post
Share on other sites

Ok, ja håpløst å feilsøke om det er loddefeil. Jeg har gjort så mange feil at jeg har sluttet å være optimist... Bruker alltid beeper etter lodding for å sjekke. Synes egentlig ikke de der pinnene er det verste. Men når jeg skal lage loddebaner på sånne protoboard (de med bare huller og en kobberfirkant pr hull/ingen ferdige baner) så pleier de å være nær ved å gå i veggen. Hver gang. Blir alltid kortslutning. Senest i går. Har en ørliten Ali-‘Dremel’ som jeg bruker til å frese bort banene 😁

 

Om du ikke allerede har det så anbefaler jeg et sånt loddestativ med to krokodilleklemmer. Hadde aldri klart meg uten.

 

https://www.clasohlson.com/no/p/30-7666?utm_source=google&utm_medium=organic&utm_campaign=google surfaces&gclid=Cj0KCQjwrsGCBhD1ARIsALILBYplgq1EpbRiUCxL5Eds0q-IQbfWEk_RetQICjgwTKfXGeJ6Q9oJ3cIaAktoEALw_wcB

 

 

Redigert av Fantino (see edit history)
Link to post
Share on other sites

@Fantino Jeg har et sånt loddestativ, men jeg syns det er vrient å bruke det til akkurat det. Det er egentlig bare to ting jeg lodder. Det ene er å lodde sammen kablene til strømforsyning og diverse annet, og det er ikke noe problem i det hele tatt. Det andre er de pinnene som må loddes fast på INA-ene. Forrige gang gikk det greit, denne gangen har jeg til nå prøvd to INA-er, og ingen av dem funker. Så jeg får prøve å lodde dem om igjen. Som sagt skulle jeg gjerne hatt de små j...lene ferdig loddet! :headbang:

 

Edit: Forresten, det stemmer ikke helt. Jeg avlodder og lodder på nye taster på Matias-tastaturet mitt (ergonomisk, det eneste som gjør at skuldrene mine ikke friker på 9-10 timers arbeidsdager). Det er jo også lodding på kretskort, men det flere hakk større enn det fikleriet med INA-pinner.

Redigert av Mastiff (see edit history)
Link to post
Share on other sites

Fantino skrev On 28.1.2021 at 10.14:

Jeg har hatt lyst til å bestille disse en stund da jeg syns de er så lekre, men har ikke funnet en anvendelse ennå 😂:

 

NOK 31.74  30% Off | YUESHUN 16mm 19mm 22mm 25mm Metal Piezo Switch waterproof IP68 Touch switch  Aluminum anodized Momentary push button switch
https://a.aliexpress.com/_mKmUHmp

 

Da er disse kommet. Så får jeg håpe jeg kan forstå meg på dem, det er vel bare å bruke denne komponenten: https://esphome.io/components/binary_sensor/gpio.html Og altså, som du sa tidligere, koble enten 3.3V eller jord til knappen og den andre kabelen til den pinnen jeg velger? Eller er det noe mer jeg må gjøre, eventuelt er det feil komponent? Greit å ha en liten anelse om hva jeg gjør, jeg har brent to ESP-er den siste uka pga. feilkoblinger (eller egentlig samme feilkoblingen, jeg skjønte ikke hva som foregikk før den andre begynte å lukte morsomt...).

Redigert av Mastiff (see edit history)
Link to post
Share on other sites

Delta i diskusjonen

Du kan skrive innlegget nå, det vil bli postet etter at du har registrert deg. Logg inn hvis du allerede er registrert.

Guest
Svar på dette emnet

×   Du har postet formatert tekst..   Fjern formattering

  Only 75 emoji are allowed.

×   Innholdet du linket til er satt inn i innlegget..   Klikk her for å vise kun linken.

×   Det du skrev har blitt lagret.   Slett lagret

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...