Fórum témák

» Több friss téma
Fórum
Keresés
Lapozás: OK   9 / 197
(#) KBal76 hozzászólása Jún 10, 2023
Egyre nyilvánvalóbbnak tűnik, hogy szándékos pszihológiai nyomásgyakorlással próbál rávenni a gyártó (SAMS.) a rendszeres sw.frissítésekre:
Minden éjjel repülô-módba rakjuk a telefonokat, hogy nyugodtan tudjunk aludni. Ilyenkor reggelig a telefonok 0-1% akku-merülést produkálnak. Amint viszont megjelenik egy új OneUI/rendszerfrissítés (aminek az értesítését lehetetlen letiltani), onnantól ez az éjszakai merülés 15-20%.. A beállítások legmélyebb bugyraiban sem található meg mi fogyaszt ilyenkor, de nem segít a repülô-mód elôtti újraindítás sem (nincsenek a telefonokon utólag felpakolt játékok vagy appok). Egy hete kényszerbôl lefrissítettem a telókat (több egyforma van), és azóta ahogy az várható volt, újból nem merülnek éjjel, és kb. 2x tovább bírják egy töltéssel.
Azért különösen bosszantó ez, mert ennyi erôvel bármikor dönthet úgy a "kedves" gyártó, hogy X dátumtól használhatatlanra csökkenti az üzemidôt. (Ilyent amúgy csinált is néhány éve, az S7 note telefonokkal, bár ott védhetô okkal). Hogyan lehetne ez ellen védekezni? (A nagy vízen túl ilyenkor jól beperelik a Tech-cégeket...én megelégednék a jelenséget megakadályozó trükkel is.)
(#) Gafly válasza Zoli_bácsi hozzászólására (») Máj 28, 2023
Saját példa:
Issue description
Idézet:
„xxx board switching stack is hang for sometime after 447 days uptime.
Switch watchdog timer is not kicked off, and it resets the board.”

Azaz 447 naponta a watchdog ujrainditotta a kártyát, mivel lefagyott. Mivel több kártya is van, ezek egymás tartalékai is. Dehát pont egyszerre fagytak le.
Idézet:
„Aricent ISS switching stack uses Linux times() function to run internal
timer module. Linux times() may return -1 for several seconds when return
value is roll over (after n-days of uptime, depening on architecture) or
in short period after restart.
ISS time module does not handle such case and during this time all ISS
timers get stuck.”

Mellesleg az Aricent nem kutyaütő garázs cég.
Tehát a Linux times() függényben volt egy hiba, ami miatt néha (esetünkben 447 naponta) idő helyett "-1"-et küldött. Szegény szoftver fejlesztő, meg erre nem számított, ezért lefagyott tőle a szoftvere. Szerencsére ott volt a jó öreg watchdog, és resetelt. Aki a kártyát tervezte és írta rá a szofvert, meg nézett ki a fejéből, hogy mi fenét ronthattam el? Aki meg összerakta az egész nodet-t, és az azt működtető szotvert, szintén.
Idézet:
„Dehát ezt én most hogy???”

Sajnos amikor már a kártyán is van külön operációs rendszer, még a kapcsolási rajz is úgy van letöltve (FPGA), és "magas szintű" nyelven van programozva, akkor bármi megtörténhet...
(#) Kovidivi hozzászólása Máj 24, 2023
Sziasztok.
Ezt le kell írnom, mert ez életmentő lehet sokaknak...
Redmi note 11-et használok, előtte 8-am volt, és a szükséges appokat le tudtam zárni, lakatolni, hogy az android vagy a miui környezet ne zárja be automatikusan (alkalmazásváltó megnyit, appra hosszan nyomni, majd a lakat szimbólum). Az új androidnál viszont ez nem működik, hosszú nyomásra megnyitja az alkalmazást.
A probléma, hogy ha 2 alkalmazás között akar az ember váltogatni (pl. szállítási címet másol), akkor az internet böngésző mindig újrafrissül... Az akkumulátor optimalizáció ki van kapcsolva, alkalmazás és globális szinten, minden beállítás megfelelő, mégis bezárnak az alkalmazások váltáskor.
El lett dugva a lakat szimbólum: beállítások - alkalmazások - rendszeralkalmazás-beállítások - biztonság - sebességgyorsítás - zárolt alkalmazások, és itt kell kiválasztani, hogy mit nem szabad bezárni! Hát nem logikus? Majdnem kettétörtem a telefonom emiatt az óriási probléma miatt, hogy a messenger sem fut a háttérben, és nem kapok üzeneteket meg, csak ha megnyitom...
Hátha segít másnak is!

Azóta sokkal gyorsabb a telefonom, pattan minden. Az akksi üzemidő meg lényegtelen, lezárás előtt kilövöm, ami nem kell...
A hozzászólás módosítva: Máj 24, 2023
(#) icserny válasza neogeo2 hozzászólására (») Máj 22, 2023
Nem tudom, hogy segít-e, de SPIFFS "fáljrendszerrel" én csak így csinálnám:
  1. #include <ESP8266WiFi.h>
  2. #include <ESP8266WebServer.h>
  3. #include <FS.h> // Becsatoljuk az SPIFFS könyvtárat
  4. #include "secrets.h"
  5. ESP8266WebServer server(80); // Webserver objektum példányosítása
  6. void setup() {
  7.  setup_wifi();
  8.  SPIFFS.begin(); // Becsatoljuk az SPI Flash fájlrendszert
  9.  server.serveStatic("/", SPIFFS, "/index.html");
  10.  server.serveStatic("/style.css", SPIFFS, "/style.css");
  11.  server.onnotFound([]() {
  12.  server.send(404, "text/plain", "404: not Found");
  13.  });
  14.  server.begin(); // Elindítjuk a webszervert
  15. }
  16. void loop() {
  17.  server.handleClient(); // A háttérben mozgatjuk a szálakat...
  18. }


Ha vannak változó részek, akkor azt meg az AJAX technikával oldanám meg.
Ennek az oldalnak a legalján az utolsó két előadásban foglalkoztam hasonlókkal. Van előadásvázlat, mintapélda és videó is.

Az utolsó előadásból a ESP8266_WS_bme280_SPIFFS.ino mintapéldát ajánlom megtekintésre.
Az egyszerűbb (JSON nélküli) AJAX technika ismertetése pedig az utolsóelőtti előadás végén található.

Amit nem tudok, hogy mekkora a legnagyobb fájl, amivel még működik, mert én csak nyúlfarknyi programokkal próbáltam.
A hozzászólás módosítva: Máj 22, 2023
(#) robis01 válasza skorpy hozzászólására (») Máj 20, 2023
Csak egy ötlet. Próbáld ki a kártyát (olvasót) más eszközön is. Tv, laptop, telefon, kamera, tvbox, stb. hátha azok látnak rajta valamit. Ha esetleg Arduino-zól akkor azzal is meg lehet próbálni.

És a egy agyament ötlet ami az sd kártya javítás képet nézve, és a szöveget félreolvasva ugrott be. Mi van ha a kártyát fizikailag módosították? Össze kéne vetni a kettő SD kártyád, hogy ugyanúgy néznek ki. Főként arra vonatkozóan hogy az érintkezők alakja, hossza egyforma-e.
(#) robis01 válasza sany hozzászólására (») Máj 20, 2023
Nem egészen úgy van ahogy te szeretnéd.

Idézet:
„Setting a character string

  1. sevseg.setChars("abcd");


Character arrays can be displayed - as accurately as possible on a seven segment display. See SevSeg.cpp digitCodeMap[] to notes on each character. Only alphanumeric characters, plus ' ', '-', '_', and '.' are supported. The character array should be NULL terminated.”


Oka pedig a karaktertáblázat. Minden karakter (szám, betű, szimbólum) egy bájtban van tárolva. A bájtban lévő bitek sorozata leírható decimálisan, hexadecimálisan, binárisan, és még sokféle más számrendszer szerint is.
Amire hivatkozol (valamilyen számrendszerben leírt számmal) az nem más mint maga a karakter.

Amire neked szükséged lenne:
Idézet:
„Custom display setting

// Set the segments for every digit on the display
  1. uint8_t segs[4] = {0, 0x5B, 0x6D, 0x63};
  2. sevseg.setSegments(segs);


// Set the segments for a single digit. Set digit 3 to 0x63.
  1. sevseg.setSegmentsDigit(3, 0x63);


You can manipulate individual segments if needed. Each byte represents the display of a single digit, with each bit representing a single segment. The bits represent segments in the order .GFEDCBA. See SevSeg.cpp for more examples of these 'digitCodes'.”


Vannak behuzalozott futtatható mintaprogramok
Idézet:
„Sample simulations

The Wokwi team has created sample simulations of the examples in this library: Wokwi SevSeg_Counter Example
Wokwi stringWithPeriod Example.
Wokwi testWholeDisplay Example.”


Egy kicsit átírtam az eredetit, szépen lefut a szimulátorban:

  1. /* SevSeg Counter Example
  2.  
  3.  Copyright 2017 Dean Reading
  4.  
  5.  Licensed under the Apache License, Version 2.0 (the "License");
  6.  you may not use this file except in compliance with the License.
  7.  You may obtain a copy of the License at
  8.  http://www.apache.org/licenses/LICENSE-2.0
  9.  
  10.  Unless required by applicable law or agreed to in writing, software
  11.  distributed under the License is distributed on an "AS IS" BASIS,
  12.  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  See the License for the specific language governing permissions and
  14.  limitations under the License.
  15.  
  16.  
  17.  This example demonstrates a very simple use of the SevSeg library with a 4
  18.  digit display. It displays a counter that counts up, showing deci-seconds.
  19.  */
  20.  
  21. #include "SevSeg.h"
  22. SevSeg sevseg; //Instantiate a seven segment controller object
  23.     byte veletlenszam;
  24.     byte A = 0;
  25.     byte B = 0;
  26.     byte C = 0;
  27.   // byte dobporges =0; // ez lett a deciSeconds
  28.  
  29. void setup() {
  30.   byte numDigits = 4;
  31.   byte digitPins[] = {2, 3, 4, 5};
  32.   byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
  33.   bool resistorsOnSegments = false; // 'false' means resistors are on digit pins
  34.   byte hardwareConfig = COMMON_ANODE; // See README.md for options
  35.   bool updateWithDelays = false; // Default 'false' is Recommended
  36.   bool leadingZeros = false; // Use 'true' if you'd like to keep the leading zeros
  37.   bool disableDecPoint = false; // Use 'true' if your decimal point doesn't exist or isn't connected
  38.  
  39.   sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments,
  40.   updateWithDelays, leadingZeros, disableDecPoint);
  41.   sevseg.setBrightness(90);
  42.  
  43.   Serial.begin(9600);
  44. }
  45.  
  46. void loop() {
  47.   static unsigned long timer = millis();
  48.   static int deciSeconds = 0;
  49.  
  50.  veletlenszam = random(0,255);
  51.      A= veletlenszam;
  52.  veletlenszam = random(0,255);
  53.      B= veletlenszam;
  54.  veletlenszam = random(0,255);
  55.      C= veletlenszam;
  56.  
  57. uint8_t segs[4] = { 0, A, B, C};
  58. sevseg.setSegments(segs);
  59.  
  60.     Serial.print("deciSeconds:");
  61.     Serial.print(deciSeconds);
  62.     Serial.print("  A:");
  63.     Serial.print(A , BIN);
  64.     Serial.print("  B:");
  65.     Serial.print(B , BIN);
  66.     Serial.print("  C:");
  67.     Serial.println(C , BIN);
  68.  
  69.  if (millis() - timer >= 100) {
  70.     timer += 100;
  71.     deciSeconds++; // 100 milliSeconds is equal to 1 deciSecond
  72.  
  73.     if (deciSeconds == 31) { // Reset to 0 after counting for 30 seconds.
  74.       deciSeconds=0;
  75.        if (A == B && A==C){
  76.         Serial.println("NYERT");
  77.       }
  78.       else{
  79.         Serial.println("NEM NYERT");
  80.       }
  81.       int x = 0;
  82.       do {
  83.         //Programfutás vége
  84.       } while (x < 100);
  85.    }
  86.  
  87.  }
  88.   sevseg.refreshDisplay(); // Must run repeatedly
  89. }
  90.  
  91. /// END ///


És még egy figyelembe veendő felhívás:

Idézet:
„Warning: Any calls to delay() will interfere with the display. Any delays introduced by other functions will produce undesirable effects on the display.”
(#) robis01 válasza SzilCsong hozzászólására (») Máj 18, 2023
Jó dolog az Arduino, én is szeretem, csak kicsit olyan mint a csajok bulikban. Dekoratívak, jól néznek ki, könnyen kezelhetőnek tűnnek, de amikor hazaviszed és elkezded megismerni rájössz hogy a felszín nem elég a boldogsághoz, kellene hozzá az összetett feladatokban való helytállás is.

Egy helyről van az összes panel?
Csak mert egy lehetséges ok:
Idézet:
„(2) *some boards contain counterfeit IC's * which do not have the correct product code when queried.”


Mások is írnak arról hogy nem eredetinél gondot okoz ha több egység van felfűzve egy SPI portra: spi problem

Tippem szerint a hamis más időzítésekkel dolgozhat mint az eredeti, vagy túl magas bemeneti kapacítása van, egy panel még nem okoz problémát, de kettő már hibát okoz. Meg lehetne próbálni felhúzó ellenállást tenni az SS lábra. Ha be tennél valami leválasztót, akár optókaput az SS portra, kiderülhet hogy a 2V melyik eszközből jön.

Jó lenne láthatóvá tenni a jeleket is valami logikai analizátorral (pl. Arduinot is támogató sigrok)

Javasolnám hogy próbáld ki más nyelven is (c, python, bascom, asm, stb. ) ha megoldható. Itt is vannak mintaprogramok: Bascom

Esetleg valami szimulátorban (SimulIde, wokwi, Proteus, stb.) is ki lehetne próbálni, ott is rá lehet tenni logikai analizátort ami megmutatná minek is kellene történnie.

Vagy ha van más két egyforma SPI-s valamilyen panelod, azzal is ki lehet próbálni hogy jól működik-e az SPI port az ARDUINO-n.
(#) zosza18 válasza asch hozzászólására (») Máj 16, 2023
Teljes mértékben egyet értek Veled. A Kialakítás nagyon sokat befolyásol a végtermék használatában. Azzal is egyet értek, hogy a kész PLC már processzort tartalmaz, nem arduino lapkát tüskesoron rátéve az elektronikára. A tesztelések és fejlesztések alatt nyílván nem annyira fő szempont, de a végleges projektben már igen is úgy szép és kerülöd el a kontakthibákat. Az I/O bővítéseket ahogy mondod is vagy shift register, vagy I2C-s portbővítővel lehet tuningolni. Amennyiben igény van a több soros/ ethernet kommunikációra, akkor értelem szerűen lehet más processzorral is felépíteni. A jó az, hogy nem csak atmega van, hanem stm és még ki tudja mi, amit arduino IDE-ben lehet írni. Oké hogy az IDE-ben sok a felesleg, de ha egyszer megfelel a célnak, akkor kit érdekel? Nem az ipar 6.0-át akarjuk feltalálni, hanem csak egy stabil jól működő PLC-t építeni, ami elérhető áron megvalósítható.
Amiket csináltam, azok mind magánszemély által kért megvalósítások "kis" cégnél, ahol ez volt a legegyszerűbb és jobb megoldás. Van 2 ipari téma is, de ott is az összetett AI/AO/DI/DO és egyéb perifériák miatt esett erre a megoldásra a választás, mégis helytáll.
(#) hadhazik hozzászólása Máj 15, 2023
heltec_lora_wifi_esp32 sender cod:

  1. #define boiler 23 // villanyra kapcsol,rel1
  2. #define gaz_kazan 17 // gázra kapcsol,rel2
  3. #include <OneWire.h>
  4. #include <DallasTemperature.h>
  5. #define ONE_WIRE_BUS 13
  6. OneWire oneWire(ONE_WIRE_BUS);
  7. DallasTemperature sensors(&oneWire);
  8. DeviceAddress D0 = { 0x28, 0x31, 0xBF, 0x29, 0x07, 0x00, 0x00, 0x7D }; // "T1"
  9. DeviceAddress D1 = { 0x28, 0x4F, 0x8E, 0x2A, 0x07, 0x00, 0x00, 0x37 }; // "T2"
  10. #include <Wire.h>
  11. const char* ssid     = "";
  12. const char* password = "";
  13. const char* ntpServer = "hu.pool.ntp.org";
  14. const long  gmtOffset_sec = 0;
  15. const int   daylightOffset_sec = 3600;
  16. #define RTC_ADDRESS 0x68
  17. #include <RtcDS3231.h>
  18. RtcDS3231<TwoWire> Rtc(Wire);
  19. // Convert normal decimal numbers to binary coded decimal
  20. byte decToBcd(byte val){
  21. return( (val/10*16) + (val%10) );
  22. }
  23.  
  24. // Convert binary coded decimal to normal decimal numbers
  25. byte bcdToDec(byte val){
  26. return( (val/16*10) + (val%16) );
  27. }
  28. #include <Arduino.h>
  29. #include "Wire.h"
  30. #include "oled.h"
  31. #include <WiFi.h>
  32. #include "time.h"
  33. #include <LoRa.h>
  34.  
  35. #define SCK     5    // GPIO5  -- SX1278's SCK
  36. #define MISO    19   // GPIO19 -- SX1278's MISO
  37. #define MOSI    27   // GPIO27 -- SX1278's MOSI
  38. #define SS      18   // GPIO18 -- SX1278's CS
  39. #define RST     14   // GPIO14 -- SX1278's RESET
  40. #define DI0     26   // GPIO26 -- SX1278's IRQ(Interrupt Request)
  41. #define BAND    433E6
  42. unsigned int state = 0;
  43. unsigned int counter = 0;
  44. String rssi = "RSSI --";
  45. String packSize = "--";
  46. String packet ;
  47. struct tm timeinfo;
  48. static char msg[20]; // character buffer
  49. OLED display = OLED(4, 15, 16, 0x3C, 128, 32, true); // SSD1306
  50. void szelep_vez ()
  51. //T1+T2 >41 II T1>25= a boilerben van melegvíz
  52. //rel2/pin17 villanyra kapcsol
  53. //T1+T2<41 II T1<25= gáz melegíti a vizet
  54. //rel1/pin23 gázra kapcsol
  55. {
  56.    sensors.requestTemperatures();
  57.  float T1 = sensors.getTempC(D0);
  58.  float T2 = sensors.getTempC(D1);
  59. if((T1+T2) > 41 || T1>25)
  60. {
  61.  display.begin();
  62.  display.clear();
  63.  display.draw_string(4, 8, "BOILER", OLED::DOUBLE_SIZE);
  64.  display.display();
  65.  digitalWrite(boiler, HIGH);
  66.  state = 1;
  67.  digitalWrite(gaz_kazan, LOW);
  68.  delay(5000);
  69. }
  70. else
  71. {
  72.  display.begin();
  73.  display.clear();
  74.  display.draw_string(4, 8, "GAZ_KAZAN", OLED::DOUBLE_SIZE);
  75.  display.display();
  76.  digitalWrite(gaz_kazan, HIGH);
  77.  state = 0;
  78.  digitalWrite(boiler, LOW);
  79.  delay(5000);
  80. }
  81. }
  82. void setup(){
  83.   pinMode(boiler, OUTPUT); //villanyra kapcsol
  84.   digitalWrite(boiler, LOW);
  85.   pinMode(gaz_kazan, OUTPUT); //gázra kapcsol
  86.   digitalWrite(gaz_kazan, LOW);
  87.   pinMode(16,OUTPUT);
  88.   pinMode(25,OUTPUT);
  89.   digitalWrite(16, LOW);    // set GPIO16 low to reset OLED
  90.   delay(50);
  91.   digitalWrite(16, HIGH); // while OLED is running, must set GPIO16 in high
  92.  Serial.begin(115200);
  93.    while (!Serial);
  94.  
  95.   SPI.begin(SCK,MISO,MOSI,SS);
  96.   LoRa.setPins(SS,RST,DI0);
  97.   if (!LoRa.begin(433E6)) {
  98.     Serial.println("Starting LoRa failed!");
  99.     while (1);
  100.   }
  101.   Serial.println("init ok");
  102.  
  103.  Wire.begin();
  104.    Serial.setDebugOutput(true);
  105.   //setTime(&timeinfo); // Valamikor be kell állítani az órát...
  106.  Serial.print("Connecting to ");
  107.  Serial.print(ssid);
  108.  WiFi.begin(ssid, password);
  109.  while (WiFi.status() != WL_CONNECTED) {
  110.  delay(500);
  111.  Serial.print(".");
  112.  }
  113.   Serial.println("");
  114.   Serial.println("WiFi connected.");
  115.    // Init and get the time
  116.  
  117.   configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  118.   printLocalTime();
  119.  
  120.  Serial.println();
  121.  Serial.print("Connected! IP address: ");
  122.  Serial.println(WiFi.localIP());
  123.   //disconnect WiFi as it's no longer needed
  124.   WiFi.disconnect(true);
  125.   WiFi.mode(WIFI_OFF);
  126.  display.begin();
  127.  display.clear();
  128.  display.draw_string(4, 8, "RTC clock", OLED::DOUBLE_SIZE);
  129.  display.display();
  130.  
  131. //------- Initialize the Temperature measurement library--------------
  132. sensors.begin();
  133. sensors.setResolution(D0, 10); //T1
  134. sensors.setResolution(D1, 10); //T2
  135. // set the initial time here:
  136.  //DS3231 seconds, minutes, hours, day, date, month, year
  137. //setDS3231time(00,34,12,2,6,3,23);
  138. }
  139.  
  140. void loop(){
  141.  sensors.requestTemperatures();
  142.  float T1 = sensors.getTempC(D0);
  143.  float T2 = sensors.getTempC(D1);
  144.    Serial.print("Sending packet: ");
  145.   Serial.println(counter);
  146.    // send packet
  147.   LoRa.beginPacket();
  148.   LoRa.print(state);
  149.   LoRa.print("  ");
  150.   LoRa.print("HELLO");
  151.   LoRa.print(T1 );
  152.   LoRa.print("  " );
  153.   LoRa.print(T2 );
  154.   LoRa.print("  ");
  155.   LoRa.print(counter);
  156.   LoRa.endPacket();
  157.   counter++;
  158.   digitalWrite(25, HIGH);   // turn the LED on (HIGH is the voltage level)
  159.   delay(1000);                       // wait for a second
  160.   digitalWrite(25, LOW);    // turn the LED off by making the voltage LOW
  161.   delay(1000);  
  162.  getLocalTime(&timeinfo); // display time/date
  163.  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
  164.         RtcTemperature temp = Rtc.GetTemperature();
  165.         temp.Print(Serial);
  166.         // you may also get the temperature as a float and print it
  167.         // Serial.print(temp.AsFloatDegC());
  168.         Serial.println(" C ");
  169.  display.clear();
  170.  strftime (msg, 15, "%Y-%b-%d %a ", &timeinfo);
  171.  display.draw_string(16, 1, msg); // Display date
  172.  strftime (msg, 10, "%T ", &timeinfo); // Display time
  173.  display.draw_string(8, 12, msg, OLED::DOUBLE_SIZE);
  174.  display.display(); // Refresh screen
  175.  delay(3000);
  176.  display.clear();
  177.  display.setCursor(8,0);
  178.  display.println("T1= ");
  179.  display.setCursor(30,0);
  180.  display.println(T1);
  181.  display.setCursor(60, 0);
  182.  display.println(" C");
  183.  display.setCursor(8,12);
  184.  display.println("T2= ");
  185.  display.setCursor(30,12);
  186.  display.println(T2);
  187.  display.setCursor(60, 12);
  188.  display.println(" C");
  189.  display.display();
  190. Serial.print(sensors.getTempC(D0));
  191. Serial.println(" C");
  192. Serial.print(sensors.getTempC(D1));
  193. Serial.println(" C ");
  194. //printLocalTime(); // display the real-time clock data on the Serial Monitor,
  195. delay(1000); // every second
  196. szelep_vez();
  197. }
  198.  
  199. //--- Set RTC time/date ------------------------------------
  200. void setLocalTime(struct tm* time) {
  201.   struct tm timeinfo;
  202.  Wire.beginTransmission(RTC_ADDRESS);
  203.  Wire.write(0); // set register pointer to 00h
  204.  Wire.write(decToBcd(time->tm_sec)); // set seconds
  205.  Wire.write(decToBcd(time->tm_min)); // set minutes
  206.  Wire.write(decToBcd(time->tm_hour)); // set hours
  207.  Wire.write(time->tm_wday + 1); // set day of week (1=Sun, 7=Sat)
  208.  Wire.write(decToBcd(time->tm_mday)); // set date (1 to 31)
  209.  Wire.write(decToBcd(time->tm_mon) + 1); // set month
  210.  Wire.write(decToBcd(time->tm_year - 100)); // year from 2000 (0 to 99)
  211.  Wire.endTransmission();
  212. }
  213. //--- Read time/date from RTC ------------------------------
  214. void getTime(struct tm* time) {
  215.  Wire.beginTransmission(RTC_ADDRESS);
  216.  Wire.write(0); // a kiolvasás kezdőcímének beállítása
  217.  Wire.endTransmission(false);
  218.  Wire.requestFrom(RTC_ADDRESS, 7); // Hét bájt kiolvasása (time/date)
  219.  time->tm_sec = bcdToDec(Wire.read() & 0x7f); // Másodpercek (0-59)
  220.  time->tm_min = bcdToDec(Wire.read()); // Percek (0 - 59)
  221.  time->tm_hour = bcdToDec(Wire.read() & 0x3f); // Órák (24h kijelzéshez)
  222.  time->tm_wday = bcdToDec(Wire.read() - 1); // Hét napja (0 - 6)
  223.  time->tm_mday = bcdToDec(Wire.read()); // hónap napja (1 - 31)
  224.  time->tm_mon = bcdToDec(Wire.read() - 1); // hónap sorszáma (0 - 11)
  225.  time->tm_year = bcdToDec(Wire.read()) + 100; // 1900-tól eltelt évek
  226. }
  227. void printLocalTime(){
  228.   struct tm timeinfo;
  229.   if(!getLocalTime(&timeinfo)){
  230.     Serial.println("Failed to obtain time");
  231.     return;
  232.   }
  233.   Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
  234.   Serial.print("Day of week: ");
  235.   Serial.println(&timeinfo, "%A");
  236.   Serial.print("Month: ");
  237.   Serial.println(&timeinfo, "%B");
  238.   Serial.print("Day of Month: ");
  239.   Serial.println(&timeinfo, "%d");
  240.   Serial.print("Year: ");
  241.   Serial.println(&timeinfo, "%Y");
  242.   Serial.print("Hour: ");
  243.   Serial.println(&timeinfo, "%H");
  244.   Serial.print("Hour (12 hour format): ");
  245.   Serial.println(&timeinfo, "%I");
  246.   Serial.print("Minute: ");
  247.   Serial.println(&timeinfo, "%M");
  248.   Serial.print("Second: ");
  249.   Serial.println(&timeinfo, "%S");
  250.  
  251.   Serial.println("Time variables");
  252.   char timeHour[3];
  253.   strftime(timeHour,3, "%H", &timeinfo);
  254.   Serial.println(timeHour);
  255.   char timeWeekDay[10];
  256.   strftime(timeWeekDay,10, "%A", &timeinfo);
  257.   Serial.println(timeWeekDay);
  258.   Serial.println();
  259. }
  260. /*void setup_sntp() {
  261.  const char* ntpServer = "hu.pool.ntp.org"; // regionális NTP hálózat
  262.  const char* time_zone = "CET-1CEST,M3.5.0,M10.5.0/3"; // Europe/Budapest időzóna
  263.  configTzTime(time_zone, ntpServer); // Időzóna megadása
  264.  Serial.println("Connecting to sntp server");
  265.  while (!getLocalTime(&timeinfo)) {Serial.print(".");} // Pontosidő lekérése
  266.  setTime(&timeinfo); // A DS3231 RTC beállítása
  267.  Serial.println(" NTP connected");
  268.  Serial.println(&timeinfo, "NTP time: %A, %B %d %Y %H:%M:%S");
  269. }*/


LoRa32u4 receiver cod:
  1. #include <SPI.h>
  2. #include <LoRa.h>
  3.  
  4. unsigned int state;
  5.  
  6. //LoRa32u4 ports
  7. #define SS      8
  8. #define RST     4
  9. #define DI0     7
  10. #define BAND    433E6
  11.  
  12. void setup() {
  13.   Serial.begin(115200);
  14.  
  15.   pinMode(13, OUTPUT);    // fehér led sets the pin as output for relay
  16.   digitalWrite(13,HIGH);
  17.   //while (!Serial);        //if just the the basic function, must connect to a computer
  18.   delay(1000);
  19.  
  20.   SPI.begin();
  21.   LoRa.setPins(SS,RST,DI0);
  22.   Serial.println("LoRa Receiver");
  23.  
  24.   if (!LoRa.begin(433E6)) {
  25.     Serial.println("Starting LoRa failed!");
  26.     while (1);
  27.   }
  28.   Serial.println("LoRa Initial OK!");
  29. }
  30.  
  31.  
  32. /*----( LOOP: RUNS CONSTANTLY )----*/
  33. void loop() {
  34.    digitalWrite(13,LOW);
  35.   // try to parse packet
  36.   int packetSize = LoRa.parsePacket();
  37.   if (packetSize) {
  38.   // received a packet
  39.     Serial.print("Received packet :");
  40.   // read packet
  41.     while (LoRa.available()) {
  42.       Serial.print((char)LoRa.read());
  43.   }
  44.       // print RSSI of packet
  45.     Serial.print("' with RSSI ");
  46.     Serial.println(LoRa.packetRssi());  
  47.  int state =((char)LoRa.read());
  48.    if (state == 1)   //Melegvíz gázkazánból..
  49.       {
  50.       Serial.println("GAZ_KAZAN - TIMER ON");          
  51.       digitalWrite(13,HIGH);    //Időzítés be..
  52.       delay(500);
  53.       }
  54.            /* if (state == 1);  //Melegvíz boilerből..
  55.       {
  56.         Serial.println("BOILER");
  57.         digitalWrite(13,LOW);   //Időzítő ki..
  58.         delay(3000);
  59.       }*/
  60.   }
  61. }
  62. //Serial print
  63. // Received packet :1  HELLO  34.25  17.00  7056' with RSSI -79
  64. //GAZ_KAZAN - TIMER ON
  65. //BOILER

Hogyan módosítsam a kódokat? Most a fogadó nem olvassa a state értéket a packeten belül, és nincs relé kapcsolás.
(#) SzilCsong válasza benjami hozzászólására (») Máj 9, 2023
Sajna most jutottam oda, hogy megint foglalkozni tudjak a két SPI eszköz problémájával.
Találtam ezt a projectet, itt is sd kártya és MFRC522 van párhuzamosan kötve, érdekes semmi trükközés nincs a kódba az inicializáláskor, minha csak 1 spi eszköz lenne.
Mondjuk rejtély, hogy tud működni, mert összeraktam és nem olvassa a RFID-t, tehát nekem nem működik, azt viszont nem tartom valószínűnek, hogy egy hibás kódot töltött volna fel valaki, akkor hol lehet a trükk?
  1. #include <MFRC522.h> // for the RFID
  2. #include <SPI.h> // for the RFID and SD card module
  3. #include <SD.h> // for the SD card
  4. #include <RTClib.h> // for the RTC
  5.  
  6. // define pins for RFID
  7. #define CS_RFID 10
  8. #define RST_RFID 9
  9. // define select pin for SD card module
  10. #define CS_SD 4
  11.  
  12. // Create a file to store the data
  13. File myFile;
  14.  
  15. // Instance of the class for RFID
  16. MFRC522 rfid(CS_RFID, RST_RFID);
  17.  
  18. // Variable to hold the tag's UID
  19. String uidString;
  20.  
  21. // Instance of the class for RTC
  22. RTC_DS1307 rtc;
  23.  
  24. // Define check in time
  25. const int checkInHour = 15;
  26. const int checkInMinute = 40;
  27.  
  28. //Variable to hold user check in
  29. int userCheckInHour;
  30. int userCheckInMinute;
  31.  
  32. // Pins for LEDs and buzzer
  33. const int redLED = 6;
  34. const int greenLED = 7;
  35. const int buzzer = 5;
  36.  
  37. void setup() {
  38.  
  39.   // Set LEDs and buzzer as outputs
  40.   pinMode(redLED, OUTPUT);  
  41.   pinMode(greenLED, OUTPUT);
  42.   pinMode(buzzer, OUTPUT);
  43.  
  44.   // Init Serial port
  45.   Serial.begin(9600);
  46.   while(!Serial); // for Leonardo/Micro/Zero
  47.  
  48.   // Init SPI bus
  49.   SPI.begin();
  50.   // Init MFRC522
  51.   rfid.PCD_Init();
  52.  
  53.   // Setup for the SD card
  54.   Serial.print("Initializing SD card...");
  55.   if(!SD.begin(CS_SD)) {
  56.     Serial.println("initialization failed!");
  57.     return;
  58.   }
  59.   Serial.println("initialization done.");
  60.  
  61.   // Setup for the RTC  
  62.   if(!rtc.begin()) {
  63.     Serial.println("Couldn't find RTC");
  64.     while(1);
  65.   }
  66.   else {
  67.     // following line sets the RTC to the date & time this sketch was compiled
  68.     rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  69.   }
  70.   if(!rtc.isrunning()) {
  71.     Serial.println("RTC is not running!");
  72.   }
  73. }
  74.  
  75. void loop() {
  76.   //look for new cards
  77.   if(rfid.PICC_IsNewCardPresent()) {
  78.     readRFID();
  79.     logCard();
  80.     verifyCheckIn();
  81.   }
  82.   delay(10);
  83. }
  84.  
  85. void readRFID() {
  86.   rfid.PICC_ReadCardSerial();
  87.   Serial.print("Tag UID: ");
  88.   uidString = String(rfid.uid.uidByte[0]) + " " + String(rfid.uid.uidByte[1]) + " " +
  89.     String(rfid.uid.uidByte[2]) + " " + String(rfid.uid.uidByte[3]);
  90.   Serial.println(uidString);
  91.  
  92.   // Sound the buzzer when a card is read
  93.   tone(buzzer, 4000);
  94.   delay(100);        
  95.   notone(buzzer);
  96.  
  97.   delay(100);
  98. }
  99.  
  100. void logCard() {
  101.   // Enables SD card chip select pin
  102.   digitalWrite(CS_SD,LOW);
  103.  
  104.   // Open file
  105.   myFile=SD.open("DATA.txt", FILE_WRITE);
  106.  
  107.   // If the file opened ok, write to it
  108.   if (myFile) {
  109.     Serial.println("File opened ok");
  110.     myFile.print(uidString);
  111.     myFile.print(", ");  
  112.    
  113.     // Save time on SD card
  114.     DateTime now = rtc.now();
  115.     myFile.print(now.year(), DEC);
  116.     myFile.print('/');
  117.     myFile.print(now.month(), DEC);
  118.     myFile.print('/');
  119.     myFile.print(now.day(), DEC);
  120.     myFile.print(',');
  121.     myFile.print(now.hour(), DEC);
  122.     myFile.print(':');
  123.     myFile.println(now.minute(), DEC);
  124.    
  125.     // Print time on Serial monitor
  126.     Serial.print(now.year(), DEC);
  127.     Serial.print('/');
  128.     Serial.print(now.month(), DEC);
  129.     Serial.print('/');
  130.     Serial.print(now.day(), DEC);
  131.     Serial.print(' ');
  132.     Serial.print(now.hour(), DEC);
  133.     Serial.print(':');
  134.     Serial.println(now.minute(), DEC);
  135.     Serial.println("sucessfully written on SD card");
  136.     myFile.close();
  137.  
  138.     // Save check in time;
  139.     userCheckInHour = now.hour();
  140.     userCheckInMinute = now.minute();
  141.   }
  142.   else {
  143.     Serial.println("error opening data.txt");  
  144.   }
  145.   // Disables SD card chip select pin  
  146.   digitalWrite(CS_SD,HIGH);
  147. }
  148.  
  149. void verifyCheckIn(){
  150.   if((userCheckInHour < checkInHour)||((userCheckInHour==checkInHour) && (userCheckInMinute <= checkInMinute))){
  151.     digitalWrite(greenLED, HIGH);
  152.     delay(2000);
  153.     digitalWrite(greenLED,LOW);
  154.     Serial.println("You're welcome!");
  155.   }
  156.   else{
  157.     digitalWrite(redLED, HIGH);
  158.     delay(2000);
  159.     digitalWrite(redLED,LOW);
  160.     Serial.println("You are late...");
  161.   }
  162. }
(#) img válasza morgo hozzászólására (») Máj 6, 2023
És mi benne a trükk? Átlagemberek számára is hozzáférhető? Melyik bank ez és milyen számlacsomag, ha nem titok?
(#) robis01 válasza SzilCsong hozzászólására (») Máj 3, 2023
Általánosságban elmondható hogy inicializáláskor érdemes szüneteket betenni, időt hagyni az eszközöknek, mivel nem mind egyformán indul, van ami gyorsabb van ami lassabb.

Nem ismerem SdFat.h használatát ezért én is csak a netre hagyatkoztam, de itt hibakódok azt írják hogy a
  1. SdError: 0X1,0X0
hibakód csak a régi verzióra vonatkozik, de írnak néhány hibaokot is.

Minták között minták QuickStart-ot néztem meg.

Itt az írják
Be kell állítani a FAT típusát:
  1. // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h,
  2. // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT.
  3. #define SD_FAT_TYPE 3


Le kell tiltani azt az eszközt ami épp nincs használva:
  1. // Set DISABLE_CHIP_SELECT to disable a second SPI device.
  2. // For example, with the Ethernet shield, set DISABLE_CHIP_SELECT
  3. // to 10 to disable the Ethernet controller.
  4. const int8_t DISABLE_CHIP_SELECT = -1;


Be kell állítani a sebességet a használt Aruino paneltól függően:
  1. // Test with reduced SPI speed for breadboards. SD_SCK_MHZ(4) will select
  2. // the highest speed supported by the board that is not over 4 MHz.
  3. // Change SPI_SPEED to SD_SCK_MHZ(50) for best performance.
  4. #define SPI_SPEED SD_SCK_MHZ(4)


De behozok még egy hibafaktort. Azt mondtad UNO-t használsz, azon pedig ATMEGA328 van. Specifikációja alapján MEG328 specifikáció a mikrokontroller 2kB SRAM-ot tartalmaz. Viszont az SdFat.h ebből 875-928 Byte felhasznál, vagyis közel a felét teljes SRAM mennyiségének, de erre fel is hívják a figyelmet SdFat. Ezért ha sok mindent akarsz használni az UNO-val, és anomáliákat tapasztalsz, azt az SRAM helyekért összeverekedő byte-ok is okozhatják SRAM hiba

És még egy kis bújtatott reklám Ha valami nem úgy megy a digitális világban ahogy elvárnánk, akkor érdemes megnézni egy logikai analizátorral. Erre sokféle megoldás van, amit jó szívvel tudok ajánlani az SIGROK terméke. Ingyenesen letölthető mindenféle platformra, sokféle eszközt támogat, még ARDUINO-t is, de érdemes venni valami céleszközt hozzá. Én ezt használom: data_analisator
(#) SzilCsong válasza Bakman hozzászólására (») Máj 3, 2023
Igen így kötöttem be, az MFRC522 ss portja a 7-re, az SD kártyáé 10-re.
A setup részbe beállítottam ezt a két portot kimenetnek, majd amelyiket épp inicalizálja annak Lowra állítottam a másikat Highra, gondolom így értetted, de inkább bemásolom a kódot.
  1. begin() failed
  2. Do not reformat the SD.
  3. No card, wrong chip  pin, or wiring error?
  4. SdError: 0X1,0X0

ezt a hibát dobja amikor inicializálná az SD-t.
Van jelentősége a sorrendnek? Először az MFRC-t, majd az SD-t inicializálja.

  1. #include <SPI.h>
  2. #include "SdFat.h"
  3. #include <MFRC522.h>
  4.  
  5. #define SS_PIN  7  //  sda  Mfrc522
  6. #define RST_PIN 6  //  reset
  7. #define SS_SD 10  
  8.  
  9. #ifndef SDCARD_SS_PIN
  10. const uint8_t SD_CS_PIN = SS;
  11. #else  // SDCARD_SS_PIN
  12. // Assume built-in SD is used.
  13. const uint8_t SD_CS_PIN = SDCARD_SS_PIN;
  14. #endif  // SDCARD_SS_PIN
  15.  
  16. // Try max SPI clock for an SD. Reduce SPI_CLOCK if errors occur.
  17. #define SPI_CLOCK SD_SCK_MHZ(50)
  18.  
  19. // Try to  the best SD card configuration.
  20. #if HAS_SDIO_CLASS
  21. #define SD_CONFIG SdioConfig(FIFO_SDIO)
  22. #elif  ENABLE_DEDICATED_SPI
  23. #define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK)
  24. #else  // HAS_SDIO_CLASS
  25. #define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK)
  26. #endif  // HAS_SDIO_CLASS
  27.  
  28.  
  29.  
  30. #if SD_FAT_TYPE == 0
  31. SdFat sd;
  32. File file;
  33. #elif SD_FAT_TYPE == 1
  34. SdFat32 sd;
  35. File32 file;
  36. #elif SD_FAT_TYPE == 2
  37. SdExFat sd;
  38. ExFile file;
  39. #elif SD_FAT_TYPE == 3
  40. SdFs sd;
  41. FsFile file;
  42. #else  // SD_FAT_TYPE
  43. #error Invalid SD_FAT_TYPE
  44. #endif  // SD_FAT_TYPE
  45.  
  46.  line[20];//40
  47. boolean van = 0;
  48.  
  49.  
  50.  
  51.  
  52. MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
  53.  
  54.  
  55. void setup()
  56. {
  57.    pinMode(SS_PIN, OUTPUT);
  58.    pinMode(SS_SD, OUTPUT);
  59.    SPI.begin();      // Initiate  SPI bus
  60.    Serial.begin(9600);   // Initiate a serial communication
  61.    digitalWrite(SS_SD, HIGH);
  62.    digitalWrite(SS_PIN, LOW);
  63.  
  64.   mfrc522.PCD_Init();   // Initiate MFRC522
  65.   Serial.println("Approximate your card to the reader...");
  66.   Serial.println();
  67.  
  68.   digitalWrite(SS_SD, LOW);
  69.   digitalWrite(SS_PIN, HIGH);
  70.  
  71.  if (!sd.begin(SD_CONFIG)) {
  72.   sd.initErrorHalt(&Serial);
  73.   return;  }
  74.  
  75. }
  76. void loop()
  77. {
  78.   String str2;
  79.   // Look for new cards
  80.   if ( ! mfrc522.PICC_IsNewCardPresent())
  81.  {
  82.     return;
  83.   }                                                                 //***************************** itt történik a kiolvasás, itt vár, amíg nem olvas********************************
  84.  //   one of the cards
  85.   if ( ! mfrc522.PICC_ReadCardSerial())
  86.   {
  87.     return;
  88.   }
  89.   //Show UID on serial monitor
  90.   Serial.print("UID tag :");
  91.                                                                                                         // String content= "";
  92.                                                                                                         //  byte letter;
  93.   for (byte i = 0; i <  4; i++)                                                                         // mfrc522.uid.size; i++)       //***** 4 byte, 4* fut le
  94.   {
  95.    // Serial.print (mfrc522.uid.uidByte[i],HEX);  
  96.      Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0":" ");         // : " " ez azért kell, hogy ne egybe írja ki az azonosító számot
  97.      Serial.print(mfrc522.uid.uidByte[i],HEX);                                                             //, HEX);
  98.                                                                                                        //  content.(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
  99.                                                                                                  //  content.(String(mfrc522.uid.uidByte[i], HEX));
  100.                                                                                        
  101.    byte Bajt;
  102.    String  str1;
  103.    String _2;
  104.    Bajt= (mfrc522.uid.uidByte[i]);                     //< 0x10 ? " 0" : " ");
  105.    str1 = String(Bajt,HEX);
  106.  
  107.    if (str1.length() < 2){               //  megnézi, hogy 2 karakternél kevesebb (0-val kezdődik) ezért hozzá kell írni egy 0-át, hogy ott is legyen
  108.        _2 = str1;
  109.         str1= "0" + _2;
  110.        }
  111.    str1.toUpperCase();                // átalakítja nagybetűssé
  112.    str2= str2 + str1 ;
  113.    str2= str2 + " ";                   // hozzátesz egy " "-t minden byte után
  114.   }
  115.   Serial.println();
  116.  
  117.   delay(1000);
  118.   Serial.println(str2);
  119.  
  120. }
A hozzászólás módosítva: Máj 3, 2023
(#) itibi hozzászólása Máj 1, 2023
Meg is jött, Siglent SDS1104X-E.
Sokkal okosabb mint én.
note:
Siglent oszcilloszkópoknál nincs lehetőség zoom out
funkció használatára. mivel mindig
rögzített memóriamélységet használnak.
Nanosec/1pts a felbontása, pl. 100ns-os felbontásnál,
(14 rács vízstintesen),140Kpts a használt memória.
A többi memóriát a "History" funkció használja.
Más scope-oknál aut. beállítással ugyanígy működik mint a Siglent,
de ha más scope-nál pl. beállítod a teljes memóriát fix értékre kéziben,
akkor tudsz kifele is zoom-olni (gyártónként változó, de a legtöbb ilyen!)
Siglent-nél nics ilyen.
Cserébe van lehetőség "Sequence" felvételre,ami azt jelenti,hogy ritkán
előforduló eseményeket tudsz rögzíteni, ha nem sűrűbb az imétlés,mint
2.5 us, (1/400000) bár ugye ez ideális eset, méréseim szerint inkább 5us.
Siglent(és Le Croy) máshogy használja a memóriát, .
Szerintem együtt tudok vele élni.!
(#) meone hozzászólása Ápr 28, 2023
Sziasztok!

Adott egy Setup alkotó részek:
-Arduino uno
-Egy RFM96 (LoRa) – Rádió-shield (868MHz)
-GPS modul (NEO-6MV2)
-DHT22 T, RH szenor és egy
-csapadékmérő aminek reed reléje van
Találtam egy programkódot aminek egy részét értem, és ki is egészítettem már.
Maga a mért adatok továbbítása LoRaWAN hálózaton történik.
A kapcsolat meg van, de még nem teljes a kód amit át akarok küldeni.

Van olyan valaki itt aki elmagyarázná, hogy a kód hogyan tevődik össze, mivel egy részét értem, és addig nem tudok hozzányúlni, mert nem tudom hogy tevődik össze.
A szituáció a következő.
A program beolvassa a GPS illetve a szenzorok adatait.
Ez után összepakolja egy tömbbe majd elküldi paylodon, LoRán keresztül a GW-nek majd az továbbítja a szervernek ahol feldolgozódik.
Amit nem értek, hogy a program az egyes mért értékeket megfelelő byte részekbe teszi sorosan egymás után illetve tesz hozzá elhatárolást.
A kód egy része így néz ki.
  1. uint8_t mydata[17] ={0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE, 0xF, 0x10};
  2.  
  3. static osjob_t initjob;
  4. bool newGPSdata = false;

A mydata[17] egy 17 elemű tömb amibe érkeznek a mért adatok.
Valaki elmagyarázná, hogy a számsor mit takar, illetve az utolsó 3 érték.
Csak egy pár példa, hogy ha bővíteni akarom értsem, hogy mit kell bele tenni.

Maga a program eseményvezérelt.
Hasonló mint ez a kód: ttn-otaa-pro-mini-sensors.ino.

GPS megszólítása értékek kinyerése:
  1. void get_coords () {
  2.   bool newData = false;
  3.   unsigned long chars;
  4.   unsigned short sentences, failed;
  5.   //float flat,flon,faltitudeGPS,fhdopGPS,humidity,temperature;
  6. // For one second we parse GPS data and report some key values
  7.    for (unsigned long start = millis(); millis() - start < 1000;) {
  8.     while (gpsSerial.available()) {
  9.       char c = gpsSerial.read();
  10.       Serial.write(c); // uncomment this line if you want to see the GPS data flowing
  11.       if (gps.encode(c)) { // Did a new valid sentence come in?
  12.         newGPSdata = true;
  13.       }
  14.     }
  15.   }
  16. }

Majd itt dolgozódik fel a teljes adatmenyiség, itt kerülnek a tömbbe az adatok.
  1. void do_send(osjob_t* j) {
  2.   // Check if there is not a current TX/RX job running
  3.   if (LMIC.opmode & OP_TXRXPEND) {
  4.     Serial.println(F("OP_TXRXPEND, not sending"));
  5.   } else {
  6.       float temperature, humidity, fhdopGPS, lat, lon, alt, date,time;
  7.       int16_t int16_temperature, int16_humidity, int16_hdopGPS, int16_hvopGPS,int16_alt;
  8.       int32_t int32_lat, int32_lon;
  9.       unsigned long age;
  10.       byte sat=0;
  11.  
  12.       temperature = dht.readTemperature();
  13.       humidity = dht.readHumidity();
  14.       int16_temperature = round(100.0 * temperature);
  15.       int16_humidity = round(100.0 * humidity);
  16.       mydata[0] = (byte) (int16_temperature >> 8);
  17.       mydata[1] = (byte) (int16_temperature & 0x00FF);
  18.       mydata[2] = (byte) (int16_humidity >> 8);
  19.       mydata[3] = (byte) (int16_humidity & 0x00FF);
  20.      
  21.       if (newGPSdata) {
  22.                 lat=gps.location.lat();
  23.                 lon=gps.location.lng();
  24.                 int32_lat = round(1000000.0*(lat+90.0));
  25.                 int32_lon = round(1000000.0*(lon+180.0));
  26.                 alt = gps.altitude.meters();
  27.                 int16_alt = round(alt);
  28.                 sat = gps.satellites.value();
  29.                 date = gps.date.value();
  30.                 time = gps.time.value();
  31.                 int16_hdopGPS = gps.hdop.value();
  32.                 int16_hvopGPS = gps.hdop.value();
  33.                 mydata[4] = (byte) (int32_lat >> 24);
  34.                 mydata[5] = (byte) ((int32_lat >> 16) & 0x00FF);
  35.                 mydata[6] = (byte) ((int32_lat >> 8) & 0x0000FF);
  36.                 mydata[7] = (byte) (int32_lat & 0x000000FF);
  37.                 mydata[8] = (byte) (int32_lon >> 24);
  38.                 mydata[9] = (byte) ((int32_lon >> 16) & 0x00FF);
  39.                 mydata[10] = (byte) ((int32_lon >> 8) & 0x0000FF);
  40.                 mydata[11] = (byte) (int32_lon & 0x000000FF);
  41.                 mydata[12] = (byte) (int16_alt >> 8);
  42.                 mydata[13] = (byte) (int16_alt & 0x00FF);
  43.                 mydata[14] = sat;
  44.  
  45.                 //mydata[15] =;
  46.                 //mydata[16] =;
  47.             } else {
  48.                 mydata[14] = 0;
  49.             }
  50.       get_coords();
  51.    
  52.       LMIC_setTxData2(1, (uint8_t*) mydata, sizeof(mydata), 0);
  53.      Serial.println(F("Packet queued"));
  54.   }
  55.   // Next TX is scheduled after TX_COMPLETE event.
  56. }


Az egyes változók definícióját és típusát is értem, azt is értem, hogy hogyan kerülnek bele az egyes adatokat változókba.
Viszont erről teljesen nagy a homály:
Idézet:

mydata[4] = (byte) (int32_lat >> 24);
mydata[5] = (byte) ((int32_lat >> 16) & 0x00FF);
mydata[6] = (byte) ((int32_lat >> 8) & 0x0000FF);

illetve ezt sem értem:
Idézet:

mydata[12] = (byte) (int16_alt >> 8);
mydata[13] = (byte) (int16_alt & 0x00FF);
mydata[14] = sat;

Hogyan tevődik össze akkor az adatom, mert nem tudom elképzelni.
Valaki valami gyakorlati példával el tudja mondani?
Azt értem, hogy mondjuk a "sat" a tömb 14.-eleme.
De konkrétan ezt nem értem: (int16_alt >> 8) illetve (int16_alt & 0x00FF).
Hogyan egészítsem ki ha mondjuk újabb 16-os vagy 32-es váltózóm van?

Elnézést a specifikus kérdésért, de remélem jó helyre írtam a hozzászólásomat.

Köszönöm előre is a segítséget.
(#) Gafly válasza ptibor hozzászólására (») Ápr 27, 2023
Szia,
Hybride relay néven fut.
Pontosan úgy működik ahogyan leírtad: A ki és bekapcsolásnál a triac végzi a kapcsolást, így védi a kontaktust, tartós áramnál pedig a kontaktus viszi a terhelést, és nem melegszik a triac.
Sajnos szerintem egy RC tagnál több kell, lásd a linkelt ST Application note-t.
A hozzászólás módosítva: Ápr 27, 2023
(#) zolika60 válasza szs hozzászólására (») Ápr 23, 2023
Nem. Az OTP magyarul a bank ciril betűkkel.
(#) gacsoi válasza gacsoi hozzászólására (») Ápr 21, 2023
input: ESPlay.csv
output: ./build/ESPlay.bin
Traceback (most recent call last):
File "C:\boards\nvs_partition_gen.py", line 34, in <module>
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
ModulenotFoundError: No module named 'cryptography'
error 1 on the generation for ESPlay.csv

'grep' is not recognized as an internal or external command,
operable program or batch file.
'sed' is not recognized as an internal or external command,
operable program or batch file.
Could not Find C:\boards\sed*
(#) b_zsiga válasza gacsoi hozzászólására (») Ápr 21, 2023
Az nvs_partition_genlocal.sh file paraméter nélkül indítva letörli az összes .bin file-t és újra generálja.
Paraméterrel indítva ellenőrzi, hogy létezik-e a megadott nevű .csv file és abból készít .bin-t.
Ehhez az nvs_partition_gen.py programot futtatja

python $NVS_PARTITION_GENERATOR\
--version v1\
--input "$1"\
--output "./build/$fname.bin"\
--size $SIZE_PARTITION


Ha megpróbálom futtatni, ez lesz az eredmény:
$ ./nvs_partition_genlocal.sh new_psram.csv
Jump into /home/siga/esp2/KaRadio32_4/boards directory

Board new_psram
This is the standard simple configuration for a wrover
./nvs_partition_genlocal.sh: line 21: python: command not found

Minimum NVS Partition Size needed is 0x3000 bytes. Look at this link :
https://docs.espressif.com/projects/esp-idf/en/latest/api-reference...tility

For flashing, type :
esptool --chip esp32 write_flash 0x3a2000 build/new_psram.bin


Most éppen python3 van telepítve a gépen ezért a parancsot módosítottam:
errről: python $NVS_PARTITION_GENERATOR\
erre: python3 $NVS_PARTITION_GENERATOR\

Ez csak az én egyedi problémám volt. Nem találta a python-t. Máshogy is kikerülhető a probléma. Pl. symlink-kel vagy másik python telepítéssel stb.
Én el voltam tévedve. Az esp-idf telepítésekor van egy script, ami beállít környezeti változókat. Onnantól kezdve érti a rendszer a python parancsot. Emiatt azt feltételeztem, hogy a config file fordításhoz is kell a teljes esp-idf, de most úgy látom, hogy nem.

Van Windowshoz is egy .bat file. Azt soha nem próbáltam, nincs Windows a gépemen.
A lényege ugyanaz. Az is az nvs_partition_gen.py file-t futtatja.
(#) b_zsiga válasza Skori hozzászólására (») Ápr 19, 2023
Még egy kis kiegészítés
Idézet:
„Bele kell fordítani a kódba?”

Nem kell befordítani a kódba, ez egy külön partíció lesz, de a .csv-ből a mellékelt toll-lal .bin-t kell csinálni.

A HW kiosztás részletesen le van írva a HardwareConfig.md file-ban
Ugyan ebben a file-ban a file végén le van írva lépésről lépésre a konvertálás és a betöltés.

Idézet:
„Pl. ha az enkóderrel hangerőt, és csatornát váltani nyomógobbal szeretnék, az megoldható”

Igen. Ebben az esetben az ENC0-hoz és a BTN1-het zartozó sorokhoz kell GPIO portokat rendelni.

Az alábbiak a HardwareConfig.md file-ból vannak
Two encoders maximum are supported, each with different actions:
Encoder0: the volume control and stations change when pushed and held,
### Buttons
Two set of three buttons can be configured in place or with encoder(s). The only limit is the available gpio's.
Each set has functions equivalent to Encoder0 and Encoder1:
click on button A: Start/Stop playing
click on button B and C: volume down and up for set 0 (P_BTN0), Station down and up for set 1 (P_BTN1)

If a set is not used, P_BTNx_A must be set to 255. In this case P_BTNx_B P_BTNx_C are disabled too.

Amit írtál, úgy valósítható meg, hogy kell a
P_ENC0_A
P_ENC0_B
P_BTN1_A
P_BTN1_B
P_BTN1_C

A P_BTN1_A start/stop. Ha nem akarod használni, akkor is be kell definiálni. Ha 255 az értéke, akkor a B és C gomb sem működik
P_BTN1_B és P_BTN1_C station down & up
(#) Gafly válasza proli007 hozzászólására (») Ápr 19, 2023
Annó katonaságnál a rádiós sorkatonák között volt használatos a LFP/NSP protokol az éppen folyó kommunikáció zárásaként.
Négylábú teherhordó állat testrésze, és egyes alkatrészek illesztéséről, valamint azok helyettesítéséről szólt a dolog, akkoriban katonaságnál reggelire gyakran fogyasztott felvágottal.
De a kolléga szerintem inkább erre gondolt: Linear Feedback Shift register
Rendes véletlen számot előállítani nem egyszerű, meg talán gyerekjátékhoz nem is kell annyira...
A hozzászólás módosítva: Ápr 19, 2023
(#) KoblogPerGyok válasza Kovidivi hozzászólására (») Ápr 18, 2023
"Nem értem, hogy miért nem lehet az 5kW-os invertert használni egyszerűen, és annak a kimenetére rakni a plusz terhelést, amit logika alapján kapcsolgatunk. Hát nem azért van az inverter, hogy a napelemből megtáplálja a házat? Csak a terhelést kell a termeléshez igazítani. Vagy ezzel mi a baj?"

Ki mondta, hogy ezzel baj van? Ezzel kezdődött minden. A tirak-os kapcsolgatás is. Csak esetleg olcsóbb és egyszerűbb megoldás felé is elmentünk.

Onnan indult el errefelé a keresgéés, hogy van-e kimenete ami jelezné, hogy túltermelés van. Mert ha lenne, akkor nem kell méregetni semmit sem. Csak sajnos akku töltő kimenete van. Erre írtam, hogy mi lenne, ha az inverter elkezdené tölteni a nem létező akkukat, akkor a terhelést adhatnánk rá. De nem lehetséges. Mindezt azért, hogy ne kelljen sokat mérni. Sőt, írtam is a kérdezőnek, hogy nem marad más, mint a mérés. De közben elkértem a leírást, hátha.

"csak akkor töltsön, ha van túltermelés, de ha kevés a kraft, akkor rögtön grid." - nem látok benne logikát. Mikor veszed ki az akksiból a tárolt energiát."
Pedig a beállítások lehet, hogy lehetővé teszik ezt, lehet leszedik őket és elviszik kocsikba, mittom én, mintha ezt olvastam volna, de elnézhettem.

"When PV power is not available:
1. 1
st Grid, 2nd Battery
Grid will provide power to the load first. If grid is not available, battery power will provide
power backup."

Ez nem ezt jelenti? Lehet, már nem vágom. Arra nem tért ki, hogy az mit jelent, hogy nincs pv. Totál nincs éjjel, vagy kevés. Na ennyire nem olvatam már el a leírást.
A hozzászólás módosítva: Ápr 18, 2023
(#) KoblogPerGyok válasza Kovidivi hozzászólására (») Ápr 17, 2023
Én ilyesmit olvasgatok:

Bővebben: Link

19. oldalon, mintha olyasmik is lennének, hogy mikor lehet tölteni az akkukat. Azaz hálózatról nem, vagy igen. Ott van egy csomó pipa is. "Allow battery to discharge when pv is unavailable"

nem lehetséges, hogy ilyen kis trükkös beállításokkal elérhető, hogy töltsön, de ne próbálja meg kisütni? Ez olyan villamosmérnökös megoldásokhoz hasonlít, mint pár beállítás pl PIC-nél...

"When PV power is not available:
1. 1
st Grid, 2nd Battery
Grid will provide power to the load first. If grid is not available, battery power will provide
power backup.
2. 1
st Battery, 2nd Grid (Default)"

Hátha van neki ilyen beállítása, hogy csak akkor töltsön, ha van túltermelés, de ha kevés a kraft, akkor rögtön grid. Ha nincs elég termelés, akkor rápróbál a hálózatra. ha az sincs, akkor a telepekre, de hát az nincs ugye, nem lesz villany...

Ilyesmi ki van zárva ugye? Csak mint utolsó lehetőségnek gondoltam ezt, hátha okosabbak ezek a gépek mint én.
(#) zolika60 hozzászólása Ápr 17, 2023
Idézet:
„Új támogatási információk
Köszönjük, hogy segített banki ügyeit még biztonságosabbá tenni.

Tanácsadója felkéri Önt, hogy aktiválja új szolgáltatásukat, az "OTP bank App"-t, hogy megvédje banki tranzakcióit az alábbi biztonságos linkre kattintva:
aktiválja a szolgáltatást ide kattintva
Üdvözlettel,
Az Ön új bankja
Ellenőrizd most
Με εκτιμιση, Εξυπηρέτηση πελατών της OTP bank.






© 2023 OTPbank .”

Ezt az emailt kaptam egy orosz email címről. Hihetetlen mikre nem képes a bankom.
(#) _BiG_ válasza mraulajos hozzászólására (») Ápr 16, 2023
Idézet:
„Reading the meter
The DRS-201A series energy meter is equipped with a 5+1 register. five integers are marked with
black color and one decimal is marked with red. The DRS-201D LCD series energy meter is equipped
with 5+2 LCD display which is used as recording consumption and can’t be reset to zero. The reading
accuracy is 1/100 kWh”

Kiemelés tőlem.
Nem lehet nullázni.
(#) elektrorudi hozzászólása Ápr 16, 2023
Sziasztok!
Az elmúlt 40 év alatt, gyakorlatilag minden rajzolat felviteli módot kipróbáltam, a vízálló tustól, a Charpac-os (ha így írják) ragasztott csíkokig, a műnyomópapíros vasalható rétegig. Közönséges írógép papírt és paus-t is próbáltam. Meg, ami még most nem jut eszembe . Nyomtattam tintasugarassal, és több féle lézerrel. Egy kivétel van, amit még nem használtam: a fényérzékeny fólia.
P20-at kb. 40 éve használok, közben kipróbáltam a fenti alternatívákat is. Végül, egy jó nagy kitérő után, jópár éve, visszatértem a P20-hoz.
Régóta foglalkoztat a gondolat, hogy vajon mekkora a fedett / fedettlen terület fényáteresztő képessége? Most jutottam el odáig, hogy konkrét méréseket végezzek. A méréshez használt anyagok:
- "euro film" fantázianevű írásvetítő fólia lézernyomtatóhoz (a Media Mark-ból).
- HP P3005x lézer nyomtató (valamilyen beállítással, mert nem egyértemű számomra, hogy mit is állítok be rajta?)
- Nitro hígító (festékboltból)
- Redmi note 11S + Fénymérő app. >>"Coolexp" v1.5. Készítette: alonecoder75@gmail.com
A mérést egy kompakt fénycsöves asztali lámpával végeztem, kb 20 perc bemelegedés után (ekkor stabilizálódott nagyjából a fényereje). A különböző mérések között kismértékben mozdítottam a telefont és a lámpát is, de az egy csoportba tartozó összehasonlító mérések közben ternészetesen nem! Az értékek lux-ban értendők. A mérések:
- telefon közvetlenül megvilágítva a lámpával
- 1 réteg fólia, festék nélkül
- 1 réteg fólia, festékkel fedve (teljesen kitöltve a mért felületet)
- 2 réteg fólia, festék nélkül
- 2 réteg fólia, festékkel
- 1 réteg fólia, festék nélkül, de 45 perc hígítógőzben tartás után
- 1 réteg fólia, festékkel fedve, de 45 perc hígítógőzben tartás után
A két réteg fólia mérését már nem tartottam érdemesnek nitro gőzölés után.
A mérést táblázatban rözgzítettem. Három kiemelt értéket érdemes figyelni (egész számra kerekítve)
- Egy réteg fólia fedett/nem fedett rész fényáteresztés aránya: 1:7
- Két réteg fólia fedett/nem fedett rész fényáteresztés aránya: 1:36
- Egy réteg fólia fedett/nem fedett rész fényáteresztés aránya nitró gőz után: >1:1000 !
(#) djadji válasza Bakman hozzászólására (») Ápr 15, 2023
Ezt a bekötést még nem hallottam.
Próbálom összerakni fejben. Mivel nem az egész kábelt építem én, csak egy hosszabbítót, ezért a gyári kábelben benne kell lennie ezeknek a bekötéseknek (igaz a data kábel nem jut el a telefontól a töltőig). Viszont akkor nekem nem is kellenek ezek az ellenállás bekötések, mert benne vannak a gyári kábelben.

Lerajzolom. (bocs a minőségért :jump
A rajzon a 2 zöld vékony bekötés nincs meg (még), ez hiányzik. Ez lenne a megoldás? Ez akkor azt is jelenti, hogy jó töltéshez nem csak az ellenállások kellenek, hanem valamiféle kommunikáció a töltő és a telefon között? És a power bank is tud így kommunikálni?
íezek szerint akkor akármilyen "jóféle" 5V feszültséget hozok a telefonnak egy akksiról, az nem fog tölteni annyiva amennyivel tölthetne, mert "nem hiszi el hogy az töltő, mivel nem kommunikál vele a középső 2 szálon? Ez nekem olyan hihetetlen...

STMiklos: Köszi, de itt az önszabályozás nem jön szóba, pont azért mert a gyári töltőkábel, a telefon és a töltőfej azonos, csak egy saját hosszabító szakasz kerül beépítésre.
A hozzászólás módosítva: Ápr 15, 2023
(#) Régi motoros válasza bbb hozzászólására (») Ápr 14, 2023
Én is pont onnan töltöttem le próba képpen, de sajna nem ette meg az 5.1-es android.
(#) tomszojer válasza Doky586 hozzászólására (») Ápr 12, 2023
Win95 boot floppyval is próbáltam, valami "banana" cd-rom-ot keres, de not istalled.
Nekem a fő problémám az, hogy üres a BIOS.
Ezt az elem buherát megcsinálom, nem gond. Már kifarigcsáltam az érintkezőket, már csak foglalat kell az elemnek.
A kérdés az, ha az megvan hogyan lesz BIOS?
(#) lazsi válasza tomszojer hozzászólására (») Ápr 11, 2023
Bocsi, az előbb kicsit kapkodtam... Az RTC az nem annyira "Realtek", mint inkább "Dallas", pl. DS1287 vagy hasonló. A linkelt képen a bal felső sarokban.

A 4 db memória az a bank0-ban és a bank1-ben van. Jó hír, hogy meg lehet duplázni...

Azt hiszem, ilyened van... Acer 1120SX
Sajnos, csak a fénykép stimmel, a mellette lévő vázlaton olyan alaplap szerepel, amin másmilyen a memória-foglalatok kiosztása, tehát a tiedhez nem lesz jó. De a típus alapján már tudsz célirányosan keresni.
A hozzászólás módosítva: Ápr 11, 2023
Következő: »»   9 / 197
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem