Przeszukaj forum
Pokazywanie wyników dla tagów 'C/C++'.
Znaleziono 5 wyników
-
Jako że na Forum nie ma działu gdzie można umieścić jakieś krótkie kawałki kodu, które nie kwalifikują się do miana DIY - postanowiłem założyć taki wątek. Ciekawe czy się przyjmie... Na początek - płynne miganie LED. Podobnego (ale bardziej rozbudowanego) kodu użyłem swego czasu w mini-reflektorze do teatru cieni (płynna zmiana barwy i jasności). //#define USE_MICROS #define LED_PIN 6 const int PERIOD = 5000; #define MINV (1.0/256.0) #define BITWIDTH 8 #define DELAYMS 2 float factor[2]; float wartosc; uint8_t dir; void setup() { Serial.begin(115200); float pcnt = PERIOD / (2.0 * DELAYMS); factor[0] = 1.0 / (factor[1] = pow(1.0/MINV - 1.0, (1.0 / pcnt))); wartosc = MINV; dir = 1; } void analogWriteFloat(uint8_t pin, float wartosc) { static uint8_t phase = 0; wartosc *= (1 << BITWIDTH); uint16_t pwm = (int)wartosc; if (wartosc < 16) { uint8_t w = (int)(4 * wartosc) & 3; if (w > phase) pwm+=1; } analogWrite(pin, pwm?pwm-1:0); phase = (phase + 1) & 3; } void loop() { static uint32_t ms=millis(); #ifdef USE_MICROS static uint32_t usbeg=micros(); #endif wartosc *= factor[dir]; if (wartosc < MINV) { wartosc = MINV; dir = 1; } else if (wartosc > 1.0) { wartosc = 1.0; dir = 0; Serial.println(millis() - ms); ms = millis(); } analogWriteFloat(LED_PIN, wartosc); #ifdef USE_MICROS uint32_t delta = micros() - usbeg; if (delta < DELAYMS * 1000) delayMicroseconds(DELAYMS*1000 - delta); usbeg=micros(); #else delay(DELAYMS); #endif } Miał być z komentarzami, ale kolega @farmaceuta podjął się ich napisania 🙂
-
Cześć. Piszę program obsługujący czujniki, gdzie dane są odbierane za pomocą funkcji espnow a następnie wysyłane ze stacji bazowej na serwer RemoteMe. Działa to tak że po odebraniu danych z czujnika, stacja bazowa przełącza się w tryb WIFISTA, łączy z serwerem RemoteMe i odsyła dane. Przełączanie trybów pracy realizuję w taki sposób że po odebraniu danych z czujnika, zapisuję je do pamięci RTC a następnie resetuję ESP aby po resecie znów mógł działać jako stacja. Ogólnie to działa elegancko jednak pewna rzecz nie daje mi spokoju: jest struktura do której zapisuję lub czytam z niej typedef struct { char name[SIZENAMETAB]; // nazwa czujnika float temp; // temperatura float press; // cisnienie int humm; // wilgotnosc uint16_t vbat; // U zas czujnika uint16_t timeToRestart; // czas do nast wysylki danych bool okno; // okno 0 -> zamkniete, 1->otwrte } readNow_t; typedef struct { readNow_t data; uint8_t stat; // status co ma sie dziac po resecie } sysMem_t; sysMem_t g_structData; Oraz kluczowe miejsce gdzie następuje błąd: void OnDataRecv(unsigned char *mac, unsigned char *incomingData, unsigned char len) { // dane z czujnikow kopiowanie do pamieci rtc i restart g_structData.stat = 1; // przy nastepnym resecie uruchom jako stacja memcpy(&g_structData.data, incomingData, sizeof(readNow_t)); // kopiowanie do struktury system_rtc_mem_write(RTCSTARTADRESS, &g_structData, sizeof(sysMem_t)); // kopiowanie do pamieci rtc // digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); // test Serial.println("Nowe dane"); ESP.restart(); } błąd polega na tym że jakby następowało przeciążenie stosu? nie bardzo rozumiem te komunikaty wygląda to tak: --------------- CUT HERE FOR EXCEPTION DECODER --------------- Exception (28): epc1=0x4020757f epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000 >>>stack>>> ctx: cont sp: 3ffffdf0 end: 3fffffc0 offset: 0190 3fffff80: 00000000 00000000 00000001 4010017c 3fffff90: 3fffdad0 00000000 3ffee618 4010019d 3fffffa0: 3fffdad0 00000000 3ffee618 402057d4 3fffffb0: feefeffe feefeffe 3ffe84ec 40100cdd <<<stack<<< --------------- CUT HERE FOR EXCEPTION DECODER --------------- ets Jan 8 2013,rst cause:2, boot mode:(3,7) load 0x4010f000, len 3584, room 16 tail 0 chksum 0xb0 csum 0xb0 v2843a5ac ~ld Ten system działa, jednak to mi się nie bardzo podoba, czuję że gdzieś robię błąd podczas kopiowania do pamięci RTC.
-
Dzień dobry, Potrzebuję wyciągnąć informacje z pliku Midi ( numer, początek i długość dźwięku) formatu 0 których będę potem używał do sterowania arduino. Dane będą następnie przesyłane do tablicy z której arduino będzie pobierać informacje o pozycji. Jestem początkujący , a to mój pierwszy wpis proszę o wyrozumiałość 😉
- 5 odpowiedzi
-
Hej! Właśnie się natknąłem na taki głupi problem i... a co tu dużo mówić, opiszę. Jest sobie jakaś makrodefinicja, powiedzmy: #define ILOSC 16 Jest sobie literał w stylu: const char PROGMEM napis[]="Wpisz liczbę od zera do " STRINGIFY(ILOSC-1); Pytanie: jak skonstruować makro STRINGIFY aby zwróciło w tym przypadku "15"? Najprostsza definicja: #define STRINGIFY(x) #x tworzy napis "Wpisz liczbę od zera do ILOSC-1" Trochę bardziej skomplikowany (z dokumentacji GCC): #define STRINGIFY1(x) #x #define STRINGIFY(x) STRINGIFY1(x) daje w efekcie: "Wpisz liczbę od zera do 16-1" Pytanie: jest taka możliwość żeby otrzymać string "Wpisz liczbę od zera do 15"? Przypominam, że to ma być literał (czyli wszelkie zabawy z itoa czy sprintf odpadają). Nie interesują mnie inne kompilatory poza GCC. Na razie zrobiłem protezę w stylu: #define STRINGIFY1(x) #x #define STRINGIFY(x) STRINGIFY1(x) #define MAKSIMUM 15 #define ILOSC (MAKSIMUM+1) const char PROGMEM napis[] = "Wpisz liczbę od zera do " STRINGIFY(MAKSIMUM); ale strasznie mi się nie podoba, fujasta jakaś taka 😞 @Elvis Ty się najlepiej znasz na C, powiedz czego nie wiem?
-
W terminalu daję komendę sudo apt-get install eclipse-cdt g++ Beż błędu instaluje się Eclipse oraz C++. Gdy wpisuję po wywołaniu Eclipse program niby kompiluje bo nie wykazuje błędu ale jak przechodzę do debugera daje komunikat o braku pliku bin. Co może być przyczyną?
- 2 odpowiedzi
-
- RPi 3 B
- ekran dotykowy
-
(i 1 więcej)
Tagi: