Skocz do zawartości

Problem z ESP8266 - spadki napięcia


opablo1

Pomocna odpowiedź

Witajcie,

mam taki dziwny problem z ESP - mianowicie podłączyłem moduł ESP przez stabilizator LM1117T 3,3v. Bez obciążenia na stabilizatorze idealne 3,3v. Po podłączeniu modułu wifi esp8266 napięcie spada do 3,14-3,18. I puki jest stabilnie jest ok potrafi wszystko hulać kilka dni. 
Natomiast zauważyłem że po kilku dniach/godzinach/minutach zdarzają się spadki napięcia do ok 2,6-2,8v co powoduje że moduł nie wysyła danych. 
ESP robi się wtedy bardzo ciepłe i już więcej się nie łączy z routerem. Wymagany jest reset i wszystko wraca do normy. 
Domyślam się że wina leży po stronie modułu ESP, ale gdzie szukać przyczyny? 
VCC podpięte bezpośrednio do 3,3v natomiast IO2 poprzez rezystor 10k 

tutaj macie film kiedy jest spadek napięcia i moment odłączenia vcc od lini 3,3v i widać jak wraca napięcie do normy.

https://youtu.be/rRCsHF1yNAs

Wrzucam Wam kod - może tu gdzieś jest pies pogrzebany... 

#include <SFE_BMP180.h>
#include <Wire.h>
#include <DHT.h>
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>       //Software Serial library

#define DHTPIN 7
#define DHTTYPE DHT11
#define diodaBLUE 4
#define podswietlenieLCD 6
#define DEBUG true
int Button = 5;

SFE_BMP180 pressure;
DHT dht (DHTPIN, DHTTYPE);
SoftwareSerial espSerial(2, 3);   //Pin 2 and 3 act as RX and TX. Connect them to TX and RX of ESP8266
const int rs=13, en=12, d4=11, d5=10, d6=9, d7=8;
LiquidCrystal lcd(rs,en,d4,d5,d6,d7);

float t=0;
float h=0;
float baseline=0;

String mySSID = "Xiaomi_33F9";       // WiFi SSID
String myPWD = "kokosowa_150"; // WiFi Password
String myAPI = "7MS50PGVU3R8H0PO";   // API Key
String myHOST = "api.thingspeak.com";
String myPORT = "80";
String tempFIELD = "field1"; 
String wilgFIELD = "field2";
String cisFIELD = "field3";
float sendtemp;
float sendwilg;
float sendcis;

long intervalWys = 1000;
long previousWysMillis = 0;

long previousMillis = 0;
long interval = 20000;  
long previousLEDMillis = 0;
long LEDinterval = 200;
boolean stan=true;
boolean wys=true;
boolean wys2=true;

boolean ButtonPressed=false;
boolean Toggle=false;

byte kropelka[] = {
  B00100,
  B00100,
  B01110,
  B01110,
  B11111,
  B11111,
  B11111,
  B01110
};

byte stopnie[] = {
  B01110,
  B01010,
  B01110,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};

byte C[] = {
  B01110,
  B11011,
  B10001,
  B10000,
  B10000,
  B10001,
  B11011,
  B01110
};

byte cisnienie[] = {
  B00100,
  B00100,
  B00100,
  B11111,
  B01110,
  B00100,
  B00000,
  B11111
};

void setup() 
{
  Serial.begin(9600);
  dht.begin();
  Wire.begin();
  pressure.begin();
  
  t = dht.readTemperature();            // pobranie temperatury
  h = dht.readHumidity();               //pobranie wilgotnosci
  h=h+10;                               // korekta czujnika
  baseline = getPressure();             //pobranie cisnienia
  
  lcd.begin(16,2);
  lcd.home();
  lcd.createChar(0,kropelka);
  lcd.createChar(1,stopnie);
  lcd.createChar(2,C);
  lcd.createChar(3,cisnienie);

  
  pinMode(diodaBLUE, OUTPUT);
  pinMode(podswietlenieLCD, OUTPUT);
  pinMode(Button, INPUT);
  

  espSerial.begin(115200);
  espData("AT+RST", 1000, DEBUG);                                       //Reset the ESP8266 module
  espData("AT+CWMODE=1", 1000, DEBUG);                                  //Set the ESP mode as station mode
  espData("AT+CWJAP=\""+ mySSID +"\",\""+ myPWD +"\"", 1000, DEBUG);    //Connect to WiFi network

}

void loop() 
{
  
  
  analogWrite(diodaBLUE, LOW);
  
  int i;
  
  unsigned long currentMillis = millis();  // czas programu

  if(digitalRead(Button) == HIGH)
  {
    ButtonPressed = true; 
  }
  else
  {
    ButtonPressed = false;
    Toggle = false;
  }
  if (ButtonPressed == true && Toggle == false)
  {
    Toggle = true;
    toggle();
  }
  
  
  if(currentMillis-previousWysMillis > intervalWys)                   
  {
    previousWysMillis = currentMillis;
    
    
    if (wys == true && wys2 == true)
    {
      if((((interval-(currentMillis-previousMillis))/1000)/60) == 0)
      {
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Temp:  "); 
        lcd.print(t);
        lcd.setCursor(13,0);
        lcd.write(byte(1));
        lcd.write(byte(2));
        lcd.setCursor(0,1);
        lcd.print("save za: ");
        lcd.print((interval-(currentMillis-previousMillis))/1000);
        Serial.print(currentMillis);
        Serial.print("   /   ");
        Serial.println((interval-(currentMillis-previousMillis))/1000);
        lcd.print(" s");
      }
      else
      {
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Temp:  "); 
        lcd.print(t);
        lcd.setCursor(13,0);
        lcd.write(byte(1));
        lcd.write(byte(2));
        lcd.setCursor(0,1);
        lcd.print("save za: ");
        lcd.print((((interval-(currentMillis-previousMillis))/1000)/60)+1);
        Serial.print(currentMillis);
        Serial.print("   /   ");
        Serial.println((interval-(currentMillis-previousMillis))/1000);
        lcd.print(" m");
      }
      }
     else if(wys == false && wys2==false)
     {
      if((((interval-(currentMillis-previousMillis))/1000)/60) == 0)
      {
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Wilg:  "); 
        lcd.print(h);
        lcd.setCursor(14,0);
        lcd.write(byte(0));
        lcd.setCursor(0,1);
        lcd.print("save za: ");
        lcd.print((interval-(currentMillis-previousMillis))/1000);
        Serial.print(currentMillis);
        Serial.print("   /   ");
        Serial.println((interval-(currentMillis-previousMillis))/1000);
        lcd.print(" s");
      }
      else
      {
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Wilg:  "); 
        lcd.print(h);
        lcd.setCursor(14,0);
        lcd.write(byte(0));
        lcd.setCursor(0,1);
        lcd.print("save za: ");
        lcd.print((((interval-(currentMillis-previousMillis))/1000)/60)+1);
        Serial.print(currentMillis);
        Serial.print("   /   ");
        Serial.println((interval-(currentMillis-previousMillis))/1000);
        lcd.print(" m");
      }
     wys2=!wys2;
     }
    else
   {
      if((((interval-(currentMillis-previousMillis))/1000)/60) == 0)
      { 
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Cis: "); 
        lcd.print(baseline);
        lcd.setCursor(14,0);
        lcd.write(byte(3));
        lcd.setCursor(0,1);
        lcd.print("save za: ");
        lcd.print((interval-(currentMillis-previousMillis))/1000);
        Serial.print(currentMillis);
        Serial.print("   /   ");
        Serial.println((interval-(currentMillis-previousMillis))/1000);
        lcd.print(" s");
      }
      else
      {
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("Cis: "); 
        lcd.print(baseline);
        lcd.setCursor(14,0);
        lcd.write(byte(3));
        lcd.setCursor(0,1);
        lcd.print("save za: ");
        lcd.print((((interval-(currentMillis-previousMillis))/1000)/60)+1);
        Serial.print(currentMillis);
        Serial.print("   /   ");
        Serial.println((interval-(currentMillis-previousMillis))/1000);
        lcd.print(" m");
        
      }
      
     wys=!wys;
   }
   wys=!wys;
   wys2=!wys2;
    
  }
  
/*
if(currentMillis-previousLEDMillis > LEDinterval)                     // mrugalące diody co 1 sekundę
{
 previousLEDMillis = currentMillis;
  
 stan=!stan;
 
 if (stan == true)
  {
   
   digitalWrite(diodaRED, HIGH);
 digitalWrite(diodaGREEN, LOW);
  }
  else
 {
   
   digitalWrite(diodaRED, LOW);
    digitalWrite(diodaGREEN, HIGH);
  }
 }
*/
  
  if(currentMillis - previousMillis > interval)                         // odliczenie 30minut na pobranie danych
  {
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Wysylam dane na:");
    lcd.setCursor(0,1);
    lcd.print("ThingSpeak");
    previousMillis = currentMillis;
    digitalWrite(diodaBLUE, HIGH);

    t = dht.readTemperature();            // pobranie temperatury
    h = dht.readHumidity();               //pobranie wilgotnosci
    h=h+10;                                     // korekta czujnika
    baseline = getPressure();             //pobranie cisnienia
  
  
  if(isnan(t) || isnan(h))
  {
    Serial.println("Błąd odczytu z czujnika");
  }
  else
  {
    Serial.print("Wilgotność: ");
    Serial.print(h);
    Serial.print(" %");
    Serial.print("  //  Temperatura: ");
    Serial.print(t);
    Serial.print(" *C");
    Serial.print("  //  Ciśnienie: ");
    Serial.print(baseline);
    Serial.println(" hPa");             // koniec pobierania danych
    }
   
   dataUpload(t,h,baseline);    
  }                                                           
}


void dataUpload (float t, float h, float baseline)                      // funkcja wysyłania danych do thingspeak
{
    String sendData = "GET /update?api_key="+ myAPI +"&field1="+String(t)+"&field2="+String(h)+"&field3="+String(baseline);
    espData("AT+CIPMUX=1", 1000, DEBUG);       //Allow multiple connections
    espData("AT+CIPSTART=0,\"TCP\",\""+ myHOST +"\","+ myPORT, 1000, DEBUG);
    espData("AT+CIPSEND=0," +String(sendData.length()+4),1000,DEBUG);  
    espSerial.find(">"); 
    espSerial.println(sendData);
    Serial.print("Value to be sent: ");
    Serial.println(t);
    Serial.print("Value to be sent: ");
    Serial.println(h);
    Serial.print("Value to be sent: ");
    Serial.println(baseline);
    espData("AT+CIPCLOSE=0",1000,DEBUG);  
}

double getPressure()
{
  char status;
  double T,P,p0,a;
  status = pressure.startTemperature();
  if (status != 0)
    {
    delay(status);
    status = pressure.getTemperature(T);
    if (status != 0)
    {
      status = pressure.startPressure(3);
      if (status != 0)
      {
        delay(status);
        status = pressure.getPressure(P,T);
        if (status != 0)
        {
          return(P);
        }
        else Serial.println("error retrieving pressure measurement\n");
      }
      else Serial.println("error starting pressure measurement\n");
    }
    else Serial.println("error retrieving temperature measurement\n");
  }
  else Serial.println("error starting temperature measurement\n");
  
}

//cześć wifi

String espData(String command, const int timeout, boolean debug)
{
  Serial.print("AT Command ==> ");
  Serial.print(command);
  Serial.println("     ");
  
  String response = "";
  espSerial.println(command);
  long int time = millis();
  while ( (time + timeout) > millis())
  {
    while (espSerial.available())
    {
      char c = espSerial.read();
      response += c;
    }
  }
  if (debug)
  {
    //Serial.print(response);
  }
  return response;
}



void toggle()
{
  digitalWrite(podswietlenieLCD, !digitalRead(podswietlenieLCD));
  
}

 

  • Lubię! 1
Link do komentarza
Share on other sites

Siema, z tego co wiem to problem może być ze stabilizatorem. Napięcie znamionowe tego stabilizatora to 3.3v ale stabilizator ma jakąś wydajność (ok. 0.8a) i jeżeli podłączymy do niego jakieś większe obciążenie to stabilizator zacznie się grzać i zacznie na nim spadać napięcie.

Ps. Nie polecam dodawać kodu z danymi uwierzytelniającymi A dać to np. w takiej formie 

String mySSID = "#######";       // WiFi SSID
String myPWD = "#############"; // WiFi Password
String myAPI = "############";   // API Key
String myHOST = "######";
String myPORT = "##";

A tu odpowiedź czat gpt 🙂

Cytat

Twoja sytuacja z ESP8266 i stabilizatorem LM1117T 3,3V sugeruje, że problem może wynikać z kilku czynników, które mogą wpływać na stabilność zasilania. Oto kilka miejsc, w których warto poszukać przyczyny:

1. Wydajność prądowa stabilizatora LM1117T:

LM1117T 3.3V ma maksymalny prąd wyjściowy na poziomie około 800 mA, ale ESP8266, szczególnie podczas działania modułu Wi-Fi (szczególnie przy nawiązywaniu połączenia z routerem), może wymagać szybkiego impulsu prądu nawet do 300-500 mA lub więcej. Jeśli stabilizator nie dostarcza wystarczającego prądu, napięcie może spaść poniżej wymaganego poziomu.

 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.