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));
  
}

 

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.