• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Jak zmienić tablicę na liczbę całkowita??
#11
Jak to coś z UDP na ESP to tam raczej bufory do odczytu i zapis są w C stringach, czyli tablicach char i raczej bym przy tym pozostał, robił swój bufor, kopiował tam przylatujący i dalej funkcjami C rozbijał to wg potrzeb. A w ogóle to wrzuć cały kod z opisem co po co, bo problem już nie jest taki podstawowy i może wymyślasz koło na nowo.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#12
Doszedłem że ten if AC_data_send mi zawiesza

Kod:
    char startMarker_AC = 0x41;
    char drugiMarker_AC = 0x43;
    char endMarker_AC = '\n';
    int send_AC = -234;
//  if (AC_data_send == true){
 
 if (strona_AC == 5) {
//       if(AC_data_send == true){
       
       udp.beginPacket(udpAddress, udpPort);    // przygotowanie do wysylki UDP
       udp.write(startMarker_AC);
       udp.write(drugiMarker_AC);
       udp.print(send_AC);  
       udp.write(endMarker_AC);
       udp.endPacket();
       AC_data_send = false;          
 }
// }
}
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#13
To jest cały kod testowy

Kod:
#include "Nextion.h"
#include "DHTesp.h"
#include <Wire.h>
#include <WiFi.h>
#include <WiFiUdp.h>

#define LED 2                    
#define ANALOG_PIN_0 36  // pomiar napiecia kanał ADC1_CH0

DHTesp dht;


const byte numChars = 32;       //
char receivedChars[numChars];   // zmienne odczytu Serial2 do UDP
boolean newData = false;        //

const char *ssid = "Audi";        //
const char *pwd = "puchatek1978"; // ustawienie sieci Wifi

const char * udpAddress = "192.168.4.1"; // adres serwera
const int udpPort = 2000;                // port UDP

int strona_AC = 0;
boolean AC_data_send = false;


WiFiUDP udp;

// Declare your Nextion objects - Example (page id = 0, component id = 1, component name = "b0")

NexPage page9 = NexPage(9, 0, "page9");
NexPage page11 = NexPage(11, 0, "page11");
NexWaveform s0 = NexWaveform(9, 3, "s0");
NexText t20 = NexText(9, 4, "t20");
NexText tTempC = NexText(11, 3, "tTempC");
NexText tHumidity = NexText(11, 4, "tHumidity");


NexTouch *nex_listen_list[] = {

 &page9,
 &page11,
 
   NULL
};
void page11PopCallback(void *ptr){

 float h = dht.getHumidity();
 float t = dht.getTemperature();
 
 
 if (isnan(h) || isnan(t)) {
   return;
 }  
 
 static char temperatureCTemp[6];
 dtostrf(t, 4, 1, temperatureCTemp);
 tTempC.setText(temperatureCTemp);

 static char hTemp[6];
 dtostrf(h, 4, 0, hTemp);
 tHumidity.setText(hTemp);

}
void page9PopCallback(void *ptr){

  uint8_t adc1 = 0;
  float adcV = analogRead(ANALOG_PIN_0);
 
  adc1 = adcV/15.5;       // 15.5 zeby 1V falował 0-80 jednostek
  s0.addValue(0, 40+adc1); // osfet 40 falowanie 500mV srodek

  static char adc2[7];
  dtostrf(adcV*0.8058, 5, 0, adc2);  // jedna jednostka to 0.8058V
  t20.setText(adc2);
 
}

void setup(void) {    
 dht.setup(14, DHTesp::DHT11);           // Connect DHT sensor to GPIO 14
 Serial.begin(512000);
 Serial2.begin(512000);
 pinMode(LED,OUTPUT);

 WiFi.begin(ssid, pwd);
 udp.begin(udpPort);
 
 while (WiFi.status() != WL_CONNECTED) {
  delay(500);
   digitalWrite(LED,HIGH);
  delay(500);
   digitalWrite(LED,LOW);
 }
 digitalWrite(LED,HIGH);
 
   
 page9.attachPop(page9PopCallback);
 page11.attachPop(page11PopCallback);

}
void loop (){
   nexLoop(nex_listen_list);    // loop wyswietlacza Nextion
   recvWithEndMarker();         // loop odczytu z Serial2
   showNewData();               // loop zapisu serial2 do UDP
   showUdpData();               // loop odczytu udp i zapisu do Serial2
   AC_data();
}

void recvWithEndMarker() {

   static byte ndx = 0;         //
   char endMarker = '\xFF';     // zmienne do odczytu Serial2
   char rc;                     // endMarker to znak konca danych
   
   while (Serial2.available() > 0 && newData == false) // sprawdzenie czy sa dane do odczytu
     {                                                 // i statusu bufora wolny czy zajety
       rc = Serial2.read();           //  odczytanie danych z Serial2 do bufora
       
       if (rc != endMarker) {        // sprawdzenie czy dane maja zakonczenie FF
           receivedChars[ndx] = rc;  
           ndx++;
           if (ndx >= numChars) {
               ndx = numChars - 1;
           }
       }
       else {
           if (ndx > 3)
           {
           receivedChars[ndx] = '\xFF';     // zapisanie  konca danych FF
           ndx = 0;
           newData = true;
            }
            else {
             memset(receivedChars, 0, sizeof(receivedChars)); // czyczenie dwóch FF FF
            }                                                 // Nextion wysyła FF FF FF
        }                                                     // Pierwszy uzyty dwa pozostale
     }                                                        // generuja puste UDP ze znakiem FF
}

void showNewData() {
   if (newData == true) {                       // stats odczytu z Serial2
       udp.beginPacket(udpAddress, udpPort);    // przygotowanie do wysylki UDP
       udp.print(receivedChars);  // zapisanie przychodzace dane Serial2 do UDP
       udp.endPacket();                                 // zakonczeneie danych UDP i wyslaniu
       memset(receivedChars, 0, sizeof(receivedChars)); // czyszczenie bufora odczytu UDP
       newData = false;                                 // zmiana statusu odczutu
   }
}

void showUdpData() {
     char uBuffer[7];     //
     char data_AC_uBuffer[7];
     char data_AC_Buffer[4];
     int i_;                     // zmienne odczytu UDP
     int rc_;                      //
     char startMarker_Nextion = 0x65;
     char startMarker_AC = 0x41;
     char endMarker_AC = '\n';
     
     if (udp.parsePacket()>0)            // sprawdzanie czy pszyszły pakiety UDP
       {
         rc_ = udp.peek();                 // podejrzanie pierwszego bajtu
         if (startMarker_Nextion == rc_){ // sprawdzenie czy pierwszy bajt to 0x65 dla Nextion
             rc_ = udp.read();
             if (udp.available() >= 6)     // sprawdzenie długosci ciagu znakow w UDP
             {                            // dla komendy dotyku Nextion callback
               uBuffer[0] = rc_;  
               for (i_ = 1; i_ < 7; i_ ++){   // rozbijanie ciagu znaków na bufory
                  uBuffer[i_] = udp.read();
               }
               if (0xFF == uBuffer[4] && 0xFF == uBuffer[5] && 0xFF == uBuffer[6])
               {
                 Serial2.write(uBuffer[0]); //
                 Serial2.write(uBuffer[1]); //
                 Serial2.write(uBuffer[2]); //
                 Serial2.write(uBuffer[3]); // zapis buforow odczytu UDP do Serial2
                 Serial2.write(uBuffer[4]); //
                 Serial2.write(uBuffer[5]); //
                 Serial2.write(uBuffer[6]); //
               }else{
                 uBuffer[i_] = 0x00;     // czyszczenie bufora jak nieprawidlowe dane
               }
           }
      }else {
         if (startMarker_AC == rc_){      // sprawdzanie czy pierwszy bajt to 0x41 dla AC
             rc_ = udp.read();
             if (udp.available() >= 6){
               data_AC_uBuffer[0] = rc_;
               for (i_ = 1; i_ < 7; i_ ++){   // rozbijanie ciagu znaków na bufory
                  data_AC_uBuffer[i_] = udp.read();
               }
               if (endMarker_AC == data_AC_uBuffer[6]){
                  data_AC_Buffer[0]= data_AC_uBuffer[2];
                  data_AC_Buffer[1]= data_AC_uBuffer[3];
                  data_AC_Buffer[2]= data_AC_uBuffer[4];
                  data_AC_Buffer[3]= data_AC_uBuffer[5];
                  String dane_UDP_data_AC = String (data_AC_Buffer);
                  strona_AC = dane_UDP_data_AC.toInt();
                  AC_data_send = true;
                 
               }else{
                 data_AC_uBuffer[i_] = 0x00;
               }
             
             }
         }
      }
  }
}  

void AC_data() {

    char startMarker_AC = 0x41;
    char drugiMarker_AC = 0x43;
    char endMarker_AC = '\n';
    int send_AC = -234;
//  if (AC_data_send == true){
 
 if (strona_AC == 5) {
//       if(AC_data_send == true){
       
       udp.beginPacket(udpAddress, udpPort);    // przygotowanie do wysylki UDP
       udp.write(startMarker_AC);
       udp.write(drugiMarker_AC);
       udp.print(send_AC);  
       udp.write(endMarker_AC);
       udp.endPacket();
       AC_data_send = false;          
 }
// }
}
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#14
Ale tak wszechświatowo, co ten kod ma na celu? To jest jakiś mostek UDP->UART?
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#15
Ciężko jednoznacznie odpowiedzieć na to pytanie w jednym zdaniu..

Ten kod co podałem to jest z esp32    jest mostek UDP-UART dla wyświetlacza Nextion i jest drugi mostek UDP-SPI dla wyświetlacza ori AUDI bieda edyszyn w liczniku po SPI przyjmuje tylko liczby (fabrycznie pokazywało częstoliwosc stacji radiowej która CD itd http://www.efiexpress.com/catalog/articl...de7f4c3eb9 )


No i w przypadku NextionLCD-UART-esp12-UDP-esp32 komunikacja działa . To męcze teraz komunikacje AClcd-SPI-esp12-UDP-esp32  

W esp12 mam już kod  zmienna tam przyjmuje liczby która jest wysyłana do AClcd dlatego potrzebowałem zmiany tablicy do init  bo UDP odczytuje do tablicy.

Esp12 wysyła do esp32 żądanie danych po UDP  zrobiłem to w postaci AC0005\n   gdzie A i \n to początek i koniec łańcucha danych  a liczba 0005  określa stronę tak to nazwałem, startMakler endMakler  musiałem określić i przechwytywać czu UDP jest dla nextion czy dla AClcd

Wiec w przypadku esp32 kiedy dostanie rozkaz po UDP AC0005\n , 0005 określa który kod ma się wykonywać i odesłać AC1234\n  gdzie 1234 to dane kodu ( odczyt z ADC, czujnika itd) czyli dane które wyśle esp12 do AClcd

Ten if co wywalał błąd to była synchronizacja  esp32 z esp12  w esp12 mam funkcję millis co jaki czas ma nastąpić odświeżenie danych  czyli co jaki czas wysyła pakiet rozkazu UDP  a kiedy otrzymuje je esp32 ma wykonać jednorazowo określony kod i wysłać dane.

A i zapomniał bym co w kodzie robi Serial2 to jest mostek serial-serial2 dla Nextion bo ich biblioteki korzystają z serial wiec nie chciało mi sie grzebać w ich bibliotekach by pozmieniać wiec udp zapisuje do serial2 który wysyła do serial i odwrotnie dane dla wyświetlacza czyli mostek serial-serial2 czyli w esp32-serial2-serial-bibliteka Nextion
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#16
Niestety nie odtworzę tego problemu, nie mam sprzętu. Analiza łatwa nie będzie. Możesz wyjeżdżać poza tablice z zapisem. Pozmieniaj też wszystkie funkcje tak by wszystkie w nich użyte zmienne lokalne były deklarowane na początku, tak też program może się wywalać. Widziałem kiedyś jak ktoś deklarował zmienną w case 0, a używał również w 1, no i czasami program padał, nie wiem jak kompilator to przeoczył. No ale nie zauważyłem nic takiego tutaj. Tablice na bufory też lepiej zadeklarować jako globalne, może pamięć wycieka. Z tym buforem UDP to też, jeśli już coś z nim robię to kopiuję do swojej tablicy, nie wiem gdzie i kiedy UDP mi coś tam pozmienia. Ale to już ktoś musiałby bardzo głęboko siedzieć w ESP by wiedzieć, ja na razie nie musiałem się z takimi problemami borykać, kiedyś mi się ESP wieszał to po prostu napisałem program od nowa z innym podejściem. No i najprostsze, jak ESP się wywala to sprawdzam na innym czy działa dobrze, może akurat wina konkretnego chipa.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#17
Zwiększyłem wielkość tablic o 1 przy odczycie z UDP i testuje na razie pół dnia i problem nie występuje.

Jak deklaruje 

 char data_AC_uBuffer[7];

  char data_AC_Buffer[4];

to przecież kod 

data_AC_uBuffer[0] = rc_;
          for (i_ = 1; i_ < 7; i_ ++) {  // rozbijanie ciagu znakĂłw na bufory
            data_AC_uBuffer[i_] = udp.read();
          }
          if (endMarker_AC == data_AC_uBuffer[6]) {
            data_AC_Buffer[0] = data_AC_uBuffer[2];
            data_AC_Buffer[1] = data_AC_uBuffer[3];
            data_AC_Buffer[2] = data_AC_uBuffer[4];
            data_AC_Buffer[3] = data_AC_uBuffer[5];
            String dane_UDP_data_AC = String (data_AC_Buffer);
            strona_AC = dane_UDP_data_AC.toInt();
            data_send_AC = true;


Nie przekracza tablic ?


edit.
Dzisiaj zamiast data_AC_uBuffer[7]; zdeklarowałem tablice wszystkie na postać data_AC_uBuffer[]={0,0,0,0,0,0,0};
I problem tez nie występuje, miedzy jednym a drugim to różnica jedynie w tym że mam zdeklarowane dane w tablicy dobrze myśle? moze przy poprzedniej deklaracji były jakieś śmiecie w pamięci i powodowało błedy??
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#18
Skoro działa to nie ma co dzielić włosa na czworo. Twój kod to nie jedyne co robi ESP8266, trzeba się trzymać bezpiecznych zaleceń i do amatorskich zastosowań wystarcza. Pisałem, że nic takiego nie widziałem, ale komunikat błędu to sugerował. Wiem o ESP już tyle, by mieć świadomość, że nie wiem prawie nic i podejrzenia mogę kierować nawet na iluminatów. Wczoraj wgrałem jakąś gotową binarkę do ESP i byłem w szoku jak się zalogował bez ssid i hasła do mojej sieci. Okazuje się, że on to trzyma gdzieś w niekasowalnej na co dzień pamięci przy flashowaniu, a już miałem poświęcić kuraka i zrobić obrzędy w celu oduroczenia routera WiFi.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#19
String dane_UDP_data_AC = String (data_AC_Buffer);

Czuje że w tym jest błąd String nie ma określonego miejsca w pamięci.. Niestety dzis bawiac się kodem na esp12e również to samo dodałem tylko linijkę newData_AC_UDP = true; i esp12e również strzeliło fochem..

if (endMarkerAC == data_AC_uBuffer[6]){
data_AC_Buffer[0]= data_AC_uBuffer[2];
data_AC_Buffer[1]= data_AC_uBuffer[3];
data_AC_Buffer[2]= data_AC_uBuffer[4];
data_AC_Buffer[3]= data_AC_uBuffer[5];
String dane_UDP_data_AC = String(data_AC_Buffer);
data_AC_UDP = dane_UDP_data_AC.toInt();
newData_AC_UDP = true;




Czy jest mozliwosc przypisania stałej wartosci "String dane_UDP_data_AC"
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#20
Ale musisz konwertować coś na stringa? Bufory UDP są w tablicach char, Twoje bufory też, chcesz wydrukować bufor to używasz go tak samo jak stringa: Serial.println(data_AC_uBuffer);. Ja miałem stronę WWW w stringu i działało to OK puki miała kilkadziesiąt znaków, jak ją rozbudowałem to niestety czas pracy skrócił się do losowych kilku-kilkuset minut. No ale to było z kilkaset znaków.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości