Stránka 20 z 26

Re: Pavouk Hiwonder

Napsal: 20 lis 2024, 15:15
od Pablo74
Asi jsem se vyjádři neobratně. Jde o to, že podle displeje a knihovny provedeš inicializaci displeje přes nějakej objekt s názvem třeba display a pak na něm voláš jednotlivý funkce jako clear(), print(), setCursor() a další.

Pokud už s displejem umíš pracovat, je to OK.

Re: Pavouk Hiwonder

Napsal: 20 lis 2024, 15:28
od luger
nějak to nechce přežvíkat. Záleží na prvním znaku ? text nebo Text ? Já mám - char stav [10];
Hlásí chybu incompatible types in assignment of 'const char [4]' to 'char [10]'

Re: Pavouk Hiwonder

Napsal: 20 lis 2024, 15:52
od Pablo74
Jazyk/knihovna Wiring - v tom programuješ - je vlastně Céčko a to je case-sensitive; rozlišuje velký a malý písmena v názvech konstant, proměnných, funkcí, příkazů, klíčových slov...

Dej se tu část kódu, kde je problém při překladu, dej sem i deklaraci proměnných; pak jsme schopni se pohnout z místa.

Re: Pavouk Hiwonder

Napsal: 20 lis 2024, 16:05
od luger
tak to bude trochu složitější :( program má cca 800 řádků a tak to budu hledat :cry:

úseky programu, no nevím jesli to pomůže

char stav [10]; // pro výpis stavu na oled
.
U8GLIB_SSD1306_128X64 oled(U8G_I2C_OPT_NONE); // inicializace OLED displeje z knihovny U8glib
.
stav = "PIR";
.
oled.setPrintPos(2,44); // nastavení pozice kurzoru
oled.print("stav: "); // výpis informace
oled.setPrintPos(37,44); // nastavení pozice kurzoru
oled.print(stav); // ----------------------

Re: Pavouk Hiwonder

Napsal: 20 lis 2024, 18:23
od kiRRow
to tě pobaví ... :lol:

Kód: Vybrat vše

char stav [10]; // pro výpis stavu na oled - špatně
char stav[10]; // pro výpis stavu na oled - správně
a jestli na to příjdeš :-D

Re: Pavouk Hiwonder

Napsal: 20 lis 2024, 19:26
od luger
To si děláš kozy :D
hned to jdu vyzkoušet

Re: Pavouk Hiwonder

Napsal: 20 lis 2024, 21:46
od luger
Zatím to nefunguje, vypisuje jeden podivný znak, nebo jiný podivný znak. A co takhle String ?

Re: Pavouk Hiwonder

Napsal: 22 lis 2024, 11:40
od luger
Nakonec jsem použil String a už to funguje. Díky za nápady.
Ale mám problém s gyroskopem.
Tento kod funguje perfektně - jedná se o vodováhu v osách X,Y,Z (stáhnuté s hwkitchen )

Kód: Vybrat vše

#include "Wire.h"
#include "Math.h"
#include "I2Cdev.h"
#include "MPU6050.h"
 
MPU6050 accelgyro;
 
const float pi = 3.141592;


const int counter_w = 100;

int16_t ax, ay, az;
float x, y, z;
int counter;
float  angle_x, angle_y, angle_z, _angle_x, _angle_y, _angle_z;
long ax_p, ay_p, az_p;
 
void setup()
{
  Wire.begin();
  Serial.begin(9600);
  
  Serial.println("Spousteni zarizeni MPU6050");
  accelgyro.initialize();
  
  Serial.println("Testovani zarizeni");
  Serial.println(accelgyro.testConnection() ? "Zarizeni funguje spravne" : "Zarizeni se nepodarilo pripojit");
}
 
void loop()
{
  // zjistí všechny hodnoty z akcelerometru
  accelgyro.getAcceleration(&ax, &ay, &az);
  
  // sčítáme potřebný počet hodnot
  ax_p = ax_p + ax;
  ay_p = ay_p + ay;
  az_p = az_p + az;

  // pocitadlo mereni
  counter++;
  
  // az bude mereni counter_w (100), tak:  
  if (counter == counter_w)
  {
    //zjistíme průmerné hodnoty
    x = ax_p/counter;
    y = ay_p/counter;
    z = az_p/counter;
     
    // vypočteme sklon a náklon [°]
    angle_x = atan2(x, sqrt(square(y) + square(z)))/(pi/180);
    angle_y = atan2(y, sqrt(square(x) + square(z)))/(pi/180);
    angle_z = atan2(z, sqrt(square(x) + square(y)))/(pi/180);
     
    // vynulujeme hodnoty    
    counter = 0;
    ax_p = 0;
    ay_p = 0;
    az_p = 0;

    // hodnoty si vypíšme do portu  
    Serial.print(angle_x); Serial.print("\t"); 
    Serial.print(angle_y); Serial.print("\t"); 
    Serial.println(angle_z);
  }
}

zajímavé je, že funguje i bez knihovny "Math" a i bez načítání těch 100 hodnot. Prostě a jednoduše dám do výpočtu úhlu místo např. proměnné x vrazím přímo ax. Možná je to méně přesné, ale to já nepotřebuji - kontroluji jen překročení určitého úhlu +/- 15 °

Takže výsledný očesaný kod je :

Kód: Vybrat vše

#include "Wire.h"
//#include "Math.h"
#include "I2Cdev.h"
#include "MPU6050.h"
 
MPU6050 accelgyro;
 
const float pi = 3.141592;

int16_t ax, ay, az;
int  angle_x, angle_y, angle_z, _angle_x, _angle_y, _angle_z;
 
void setup()
{
  Wire.begin();
  Serial.begin(9600);

  accelgyro.initialize();
  }
 
void loop()
{
  // zjistí všechny hodnoty z akcelerometru
  accelgyro.getAcceleration(&ax, &ay, &az);

    // vypočteme sklon a náklon [°]
    angle_x = atan2(ax, sqrt(square(ay) + square(az)))/(pi/180);
    angle_y = atan2(ay, sqrt(square(ax) + square(az)))/(pi/180);
    angle_z = atan2(az, sqrt(square(ax) + square(ay)))/(pi/180);
     
    

    // hodnoty si vypíšme do portu  
    Serial.print(angle_x); Serial.print("\t"); 
    Serial.print(angle_y); Serial.print("\t"); 
    Serial.println(angle_z);
    //delay (100);
  }

A další dotaz:
Nikde jsem nenašel funkci square. Je to mocnina ale nikde není zmiňovaná. Záhadná a tajemná funkce :D Jestli někdo může tak prosím o odkaz na tuto funkci. Nenašel jsem ale možná blbě hledám.

Re: Pavouk Hiwonder

Napsal: 22 lis 2024, 12:33
od gilhad
square je druhá mocnina, takže něco jako

Kód: Vybrat vše

double square(x) {return x*x;}
nebo pro jiné vhodné typy

A to s tím char[4] a char[10] nejspíš nefungovalo, protože tohle jsou obyčejná pole a asi nemají přetížené operátory přiřazení, které by nad nima dělaly stringové operace, takže to pak musí napsat člověk sám, třeba pomocí strcpy()

Re: Pavouk Hiwonder

Napsal: 22 lis 2024, 13:52
od luger
Takže ta knihovna "Math" je tam jen tak , jen že existuje? Aby to zabralo víc místa ? :D Dohledal jsem funkci sq() což by měla být druhá mocnina. S touto funkcí to samozřejmě nefunguje :( .
Proč se nato ptám?
Pokud použiji jen samostatně výše uvedený program tak gyroskop funguje správně a vypisují se správné hodnoty ve stupních. Pokud ho vrazím do pavoučka tak sice gyroskop reaguje, ale hodnoty nejsou ve stupních ale v rozsahu 0-255. A to ještě nějak podezřele divně :shock:
Knihovny jsou stejné, inicializace taky, v podstatě je to jen překopírované.