ESP8266 problem

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
svanted
Inlägg: 5082
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

ESP8266 problem

Inlägg av svanted »

jag försöker mig på ett projekt med ESP8266,
syftet är att bygga en knapplåda med en arduino och en ESP8266 som via wifi och socket connect ska få kontakt med en
raspberry pi.
men ack...
har fått igång allt mha exempelprogrammet nedan:

fungerar mot raspen, den kopplar upp och hämtar index.html och skickar ut det på serieporten i klartext.
men efterssom jag även vill ha en webserver på raspen vill jag använda en annan port, t.e.x. 23
som ju är standard telnet...
så jag byter 80 till 23 i koden...
där tar det stopp,
den kopplar upp och allt som den ska men allt den skriver ut är typ:

WiFi connected
IP address:
192.168.10.171
Connected to server
ÿý�ÿý ÿý#ÿý'

ovan är taget från ett likadant problem på nätet där det inte fanns någon lösning på problemet...
min hade inte exakt samma tecken. typ upp och nervända ?

och sedan inget..
vad jag än skickar till raspen kommer inget svar ö.h.t.
jag vill ju ha loginprompt?
för att kunna koppla och typ skicka/ta emot data...
inte säkert mot port 23 och telnet utan en egen socket server...
fast telnet skulle funka för att köra script på raspen att göra det man vill.

vad har jag förbisett?

det funkar givetvis att telnetta in mha en vanlig dator och telnet och att logga in, hur bra som helst,
men icke från ESP8266an...

är det ett teckenkodningsproblem i telnetservern?
då borde det inte gå att telnetta in på port 80 och skicka en GET request som då skriver ut index.html.

vad är det för skillnad mellan socket connects mellan portarna 80 och 23 som jag inte lyckas hitta svar på?

Kod: Markera allt

/*
 *  This sketch sends data via HTTP GET requests to data.sparkfun.com service.
 *
 *  You need to get streamId and privateKey at data.sparkfun.com and paste them
 *  below. Or just customize this script to talk to other HTTP servers.
 *
 */

#include <ESP8266WiFi.h>

const char* ssid     = "your-ssid";
const char* password = "your-password";

const char* host = "data.sparkfun.com";
const char* streamId   = "....................";
const char* privateKey = "....................";

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

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

int value = 0;

void loop() {
  delay(5000);
  ++value;

  Serial.print("connecting to ");
  Serial.println(host);
  
  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
  
  // We now create a URI for the request
  String url = "/input/";
  url += streamId;
  url += "?private_key=";
  url += privateKey;
  url += "&value=";
  url += value;
  
  Serial.print("Requesting URL: ");
  Serial.println(url);
  
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");
  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 5000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }
  
  // Read all the lines of the reply from server and print them to Serial
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
  
  Serial.println();
  Serial.println("closing connection");
}
Senast redigerad av svanted 23 december 2017, 08:50:30, redigerad totalt 2 gånger.
Användarvisningsbild
Jan Almqvist
Inlägg: 1580
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: ESP8266 problem

Inlägg av Jan Almqvist »

Ett problem jag ofta ser är att WiFiClient ligger i funktionen loop(). Då kommer tcp/ip anslutningen att kopplar ner för varje "varv".
svanted
Inlägg: 5082
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: ESP8266 problem

Inlägg av svanted »

jo, men loopen väntar ju på att läsa radslut innan den kopplar ner och går vidare?

och har testat att flytta upp loginfunktionerna i exemplet till "init" och sedan bara vänta på alla tecken som borde komma som svar,
har tyvärr inte koden tillgänglig just nu...

men ALLTID samma krumelurer till svar och sedan stendött,
vad jag än gör...

det är:

Kod: Markera allt

while(client.available()){
      String line = client.readStringUntil('\r');
      Serial.print(line);
    }
som ska läsa svaret och jag har testat med \r\n, \r eller \n
ingen skillnad.

responsen från telnetservern via en telnet klient är ju klartext och inga d-a krumelurer :evil:
Användarvisningsbild
Jan Almqvist
Inlägg: 1580
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: ESP8266 problem

Inlägg av Jan Almqvist »

Jag läser tecken för tecken vid all kommunikation. Kanske skriver readStringUntil() sönder någon variabel?

Edit: Det kan också vara att Serial.print() inte klarar lägre strängar än 64 tecken.
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

Re: ESP8266 problem

Inlägg av hawkan »

Telnet har en liten förhandling alldeles i början t ex om echo och så. Det är det du ser som tecken.
Ditt program får svara tillbaks på detta på ett relevant sätt innan sjäva kommunikationen startar.
Föreslår en studie av källkoden till en telnet-klient för se hur förhandlingen ska gå till.
svanted
Inlägg: 5082
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: ESP8266 problem

Inlägg av svanted »

oiiiii!
gracias!
hittade:
https://stackoverflow.com/questions/104 ... -answering
tack! :D


å God Jul!

på er alla...
svanted
Inlägg: 5082
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: ESP8266 problem

Inlägg av svanted »

tar upp tråden igen med nästa problem...
ESP8266 verkar vara ooootroligt långsam?
tanken är att använda den som sändare/mottagare till en fjärrkontroll,
knappsats->atmega328->ESP8266*******WIFI*******raspberry pi

men responsen från ESP8266 till raspen är seg som attan,
allt mellan 0.5 till 3 - 4 sekunder, det kommer inte att gå.
har isolerat segheten till ESP8266an och googlat runt i någon timme efter en lösning...

den kopplar upp sig snyggt och prydligt men strängarna in på serieporten tar allt mellan 0.5 och 5 sekunder att nå
socketporten på raspen.

någon som har en idé?

Kod: Markera allt

#include <dummy.h>

/*
 *  Simple HTTP get webclient test
 */

#include <ESP8266WiFi.h>


const char* ssid     = "Pi3-AP";
const char* password = "raspberry";

const char* host = "172.24.1.1";
  WiFiClient client;
int status = WL_IDLE_STATUS;                     // the Wifi radio's status
  const int port = 10001;


  
void setup() {
  Serial.begin(9600);
  delay(100);

  // We start by connecting to a WiFi network

  client.setNoDelay(true);

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print("Trying to Connect....\r\n");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("Netmask: ");
  Serial.println(WiFi.subnetMask());
  Serial.print("Gateway: ");
  Serial.println(WiFi.gatewayIP());


  Serial.print("connecting to ");
  Serial.println(host);
  
  // Use WiFiClient class to create TCP connections



  
}

int value = 0;

void loop() {

String command;

  
  if (!client.connected()) {
  

  if (!client.connect(host, port)) {
    Serial.println("connection failed");
    return;
  }

  }

while (Serial.available()==0) {             //Wait for user input
  
  }
  command=Serial.readString();


  
  
  client.print(command);
  //delay(500);
  
  // Read all the lines of the reply from server and print them to Serial
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
  

}
nifelheim
Den första
Inlägg: 2318
Blev medlem: 27 mars 2008, 22:31:16
Ort: stockholm

Re: ESP8266 problem

Inlägg av nifelheim »

ta bort atmega'n och kör koden direkt på esp8266 utan serieports omvägen
svanted
Inlägg: 5082
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: ESP8266 problem

Inlägg av svanted »

det har jag gjort, direkt från programmeringsdatorn,
samma eländiga delayer...

om du menar det?
vad gäller atmegan så läser den av en knappmatris med 16 knappar = 8 pinnar, ESPn har bara typ 2/3 pinnar...
så det blir omöjligt att köra matriskoden på den.
kanske HF moduler vore bättre men det vore kul att komplettera med appar som fjärr senare.
Borre
Inlägg: 4564
Blev medlem: 14 juni 2007, 15:43:50
Ort: Hälsingland

Re: ESP8266 problem

Inlägg av Borre »

Vad har du för ESP då?
Det är väl ändå en 10-11 användbara pinnar på en ESP, så skaffa kort där alla är utdragna till paddar.
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

Re: ESP8266 problem

Inlägg av hawkan »

Multiplexningen verkar inte vara helt optimal tycker jag. Men det kanske funkar.
Tänker att du kan ligga fast i den ena .available - loopen och det händer saker som behöver tas hand om den andra kanalen.
En variant är att kolla kolla både Serial och client . available samtidigt och om någon av de behöver ha något gjort tar du först reda på vilken det var som triggade available och gör det som ska göras. Sedan tillbaks att kolla båda. Vet inte om det hjälper.

Annars går det bra att tajma de olika delarna i din kod, det är inte så mycket, så tre-fyra mätningar av de olika operationerna borde ge dej en förståelse efter vilken del av koden som tar tid.
svanted
Inlägg: 5082
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: ESP8266 problem

Inlägg av svanted »

Skärmavbild 2018-01-23 kl. 11.53.53.png
en sådan,
använder just nu 12 pinnar på atmegan, och behöver två lysdioder åckså för wifi status.

det händer bara saker på serial, det är där atmegan skickar data p.g.a. knapptrycknigarna.
client är sekundärt och behöver bara innehålla "ACK" från raspen.

det verkar vara seriekommunikationen in till ESPn som tar tid?

men det är två knappar som är tidskritiska,
har kopplat dem direkt på ESPn så att den skickar kommandona direkt...
och de skickas momentant...
så det kanske löser problemet.

prototypen..
Skärmavbild 2018-01-23 kl. 14.00.29.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Skriv svar