|
A klónok CH340 Soros-USB illesztőjének drivere ( Letöltés)
Az csak azt jelenti, hogy abban a függvényben van a hiba. De nem a neve a rossz, hanem az a sor, amit idéztél is. Ez a helyes változat az adatlap alapján (nem próbálom ki):
ADCSRA = (1<<ADEN) | (1<<ADIE) | (1<<ADATE) | (1<<ADIF) | (1<<ADSC) |
Hoppá és működik nagyon köszönöm nem is gondoltam volna Atmega328-al megy most hogyan hogy csak ennyi volt a gond és megy ezzel is nem semmi!
Gratulálok! Foglalatban volt eleve a csip? És volt kéznél 328-as? Gyorsan ment a csere.
Hihetetlen mi pedig itt a bizonyíték rá.
Persze foglalatban volt mindíg abba teszem.
Az alábbi kódhoz kérnék segítséget.
A LoRa modulok között folyó csomag fogadáskor serialon kiíratom a fogadott adatokat, oled kijelzőn
"HELLO" szöveget és kettő hőfok adatot. A csomagok fogadásának folyamatosan kell működnie, a kijelzőt frissíteni az új adatokkal. A frissítés ne tegye olvashatatlanná a kijelzőt a túl rövid megjelenítéssel.
Delay(); beszúrással most minden 5. csomagot fogadja a vevő LoRa, 1000ms-ig megjelenítve az oleden.
Millis vagy állapotgép irányba próbáljak tovább lépni?
```cpp
#include <Wire.h>
const char* ssid = "xxxx";
const char* password = "1111";
const char* ntpServer = "hu.pool.ntp.org";
const long gmtOffset_sec = 0;
const int daylightOffset_sec = 3600;
#include <Arduino.h>
#include <Wire.h>
#include <WiFi.h>
#include <Timer.h>
#include <SPI.h>
#include <LoRa.h>
uint16_t writecount;
uint32_t startwritemS, endwritemS, timemS;
#define SCK 18 // GPIO5 -- SX1278's SCK
#define MISO 19 // GPIO19 -- SX1278's MISO
#define MOSI 23 // GPIO27 -- SX1278's MOSI
#define SS 5 // GPIO18 -- SX1278's CS
#define RST 4 // GPIO14 -- SX1278's RESET
#define DI0 26 // GPIO26 -- SX1278's IRQ(Interrupt Request)
#define BAND 433E6
unsigned int state = 0;
unsigned int counter = 0;
String rssi = "RSSI --";
String packSize = "--";
String packet ;
struct tm timeinfo;
static char msg[20]; // character buffer
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#include <StateMachine.h>
const int STATE_DELAY = 10;
int randomState = 0;
const int LED = 13;
StateMachine machine = StateMachine();
State* S0 = machine.addState(&state0);
State* S1 = machine.addState(&state1);
void setup()
{
Serial.begin(115200);
while (!Serial);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C))
{
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.display();
delay(2000); // Pause for 2 seconds
// Clear the buffer
display.clearDisplay();
Wire.begin();
Serial.setDebugOutput(true);
Serial.print("Connecting to ");
Serial.print(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
// Init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
Serial.println();
Serial.print("Connected! IP address: ");
Serial.println(WiFi.localIP());
//disconnect WiFi as it's no longer needed
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
SPI.begin(SCK,MISO,MOSI,SS);
LoRa.setPins(5,4,26);
Serial.println("LoRa Receiver");
if (!LoRa.begin(433E6)) {
Serial.println("Starting LoRa failed!");
while (1);
}
Serial.println("init ok");
display.invertDisplay(true);
delay(1000);
display.invertDisplay(false);
delay(1000);
display.clearDisplay();
randomSeed(A0);
S0->addTransition(&transitionS0S1,S1); // Transition to itself
S1->addTransition(&transitionS1S0,S0); //(see transition logic for details)
}
void loop()
{
machine.run();
delay(STATE_DELAY);
}
//=======================================
void state0(){
int packetSize = LoRa.parsePacket();
String message = "";
if (packetSize)
{ // received a packet
Serial.print("Received packet :");
while (LoRa.available())
{
message += (char)LoRa.read();
}
Serial.print(message);
// print RSSI of packet
Serial.print("' with RSSI ");
Serial.println(LoRa.packetRssi());
Serial.print("Status: ");
Serial.println(message.charAt(0));
if (message.charAt(0) == '0')
{
Serial.println(" GAZ_KAZAN");
}
else
{
Serial.println("BOILER");
delay(50);
}
}
display.setTextSize(2); // Normal 1:1 pixel scale
display.setTextColor(WHITE); // Draw white text
display.setCursor(0,0);
display.print(message.charAt(3));
display.print(message.charAt(4));
display.print(message.charAt(5));
display.print(message.charAt(6));
display.print(message.charAt(7));
display.println(message.charAt(8));
display.setTextSize(3); // Normal 1:1 pixel scale
display.setTextColor(WHITE); // Draw white text
display.print(message.charAt(9));
display.print(message.charAt(10));
display.print(message.charAt(11));
display.print(message.charAt(12));
display.print(message.charAt(13));
display.println(message.charAt(14));
display.print(message.charAt(15));
display.print(message.charAt(16));
display.print(message.charAt(17));
display.print(message.charAt(18));
display.print(message.charAt(19));
display.print(message.charAt(20));
display.println(message.charAt(21));
display.display();
}
bool transitionS0S1(){
return true;
}
void state1()
{
delay(1000);
display.clearDisplay();
}
bool transitionS1S0(){
return true;
}
void printLocalTime(){
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return;
}
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
Serial.print("Day of week: ");
Serial.println(&timeinfo, "%A");
Serial.print("Month: ");
Serial.println(&timeinfo, "%B");
Serial.print("Day of Month: ");
Serial.println(&timeinfo, "%d");
Serial.print("Year: ");
Serial.println(&timeinfo, "%Y");
Serial.print("Hour: ");
Serial.println(&timeinfo, "%H");
Serial.print("Hour (12 hour format): ");
Serial.println(&timeinfo, "%I");
Serial.print("Minute: ");
Serial.println(&timeinfo, "%M");
Serial.print("Second: ");
Serial.println(&timeinfo, "%S");
Serial.println("Time variables");
char timeHour[3];
strftime(timeHour,3, "%H", &timeinfo);
Serial.println(timeHour);
char timeWeekDay[10];
strftime(timeWeekDay,10, "%A", &timeinfo);
Serial.println(timeWeekDay);
Serial.println();
}
```
Sziasztok!
Szeretnék egy kis segítséget kérni! Elakadtam egy 128x32-es oled I2C-s kijelző inicializálásánál. Nem tudom életre kelteni. SPI-s kijelzővel nincs bajom, azt tudom kezelni. A kijelzőt SSD1306 vezérlő kezeli, ennek az adatlapjában, ahol az i2c írást mutatják, csak /slave address/ után a
/control byte/-/data byte/ ismétlődik, így az alábbi kóddal próbálkozom a parancsokat küldeni: void oledCommand1(uint8_t command) {
Wire.beginTransmission(OLED_ADDRESS);
Wire.write(0x00); // Co = 0, D/C = 0
Wire.write(command);
Wire.endTransmission();
}
Van esetleg valakinek egy működő I2C-s init-je? Vagy több bájtos parancs küldő algoritmusa? Segítséget előre is köszönöm! Még annyi, hogy adafruit meg hasonló könyvtárakkal nem szeretném megoldani, magam szeretném majd megírni, ha sikerül elindulni vele. A hozzászólás módosítva: Nov 4, 2023
Rájöttem közben, 0x00 helyett 0x80 kell és megy.
Én úgy csinálnám, hogy két állapotgép lenne, az egyik a LORA adatok vétele, a másik a megjelenítés. Az adatokból a legújabbat tárolná le a LORA vevő egy static függvényen kívüli változóba. A megjelenítő pedig mondjuk másodpercenként frissülne, és mindig az aktuálisat írná ki pont úgy, ahogy most is implementálva van. Delayt nem használnék, hanem időzítő alapú állapotátmenettel valósítanám meg. Tehát a rajzoló állapotgépben mondjuk másodpercenként mennék a refresh állapotba, majd onnan az újrarajzolás után a sleep állapotba.
Az állapotgép vagy a loop-ba kézzel beírt akciók ekvivalensek. Ha már egyszer bevetted ezt az állapotgépes libet, akkor már ezzel oldanám meg feltéve, hogy sikerül megvalósítani a célt. De ugyanezt meg lehet csinálni úgy is, hogy számontartod, hogy melyik milli()-ben volt az utolsó rajzolás és ha eltelt 1000, akkor rajzolsz újra.
A program Wifis része újracsatlakozik magától, ha esetleg leszakad valami miatt? Ha nem, akkor még erre is csinálnék egy állapotgépet.
```cpp
/*esp2 module,wifi,LoRa,0.96 oled
Jelenleg így módosítottam a kódot.
Setupban a void loraserial nem fut le a többi rész igen.
Loopban a beállított delay időkig megjeleníti a kijelzéseket.
Ami érdekes. egy ideig csak "RSSI -164" kerül kijelzésre, aztán felváltva "RSSI -88" és "HELLO 37.00 19.00"*/
#include <Wire.h>
const char* ssid = "xxxx";
const char* password = "xxxx";
const char* ntpServer = "hu.pool.ntp.org";
const long gmtOffset_sec = 0;
const int daylightOffset_sec = 3600;
#include <Arduino.h>
#include <Wire.h>
#include <WiFi.h>
#include <Timer.h>
#include <SPI.h>
#include <LoRa.h>
#define SCK 18 // GPIO5 -- SX1278's SCK
#define MISO 19 // GPIO19 -- SX1278's MISO
#define MOSI 23 // GPIO27 -- SX1278's MOSI
#define SS 5 // GPIO18 -- SX1278's CS
#define RST 4 // GPIO14 -- SX1278's RESET
#define DI0 26 // GPIO26 -- SX1278's IRQ(Interrupt Request)
#define BAND 433E6
unsigned int state = 0;
unsigned int counter = 0;
String rssi = "RSSI --";
String packSize = "--";
String packet ;
String message = "";
struct tm timeinfo;
static char msg[20]; // character buffer
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup()
{
Serial.begin(115200);
while (!Serial);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C))
{
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.display();
delay(2000); // Pause for 2 seconds
Wire.begin();
Serial.setDebugOutput(true);
Serial.print("Connecting to ");
Serial.print(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
// Init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
Serial.println();
Serial.print("Connected! IP address: ");
Serial.println(WiFi.localIP());
//disconnect WiFi as it's no longer needed
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
lorastart();
loraserial();
delay(2000);
display.invertDisplay(true);
delay(1000);
display.invertDisplay(false);
delay(1000);
}
void loop()
{
oledstart();
charoled();
rssioled();
}
//=======================================
void lorastart()
{
SPI.begin(SCK,MISO,MOSI,SS);
LoRa.setPins(5,4,26);
Serial.println("LoRa Receiver");
if (!LoRa.begin(433E6))
{
Serial.println("Starting LoRa failed!");
while (1);
}
Serial.println("init ok");
}
void oledstart()
{
int packetSize = LoRa.parsePacket();
if (packetSize)
{ // received a packet
while (LoRa.available())
{
message += (char)LoRa.read();
}
}
}
void loraserial()
{
int packetSize = LoRa.parsePacket();
if (packetSize)
{ // received a packet
Serial.print("Received packet :");
while (LoRa.available())
{
message += (char)LoRa.read();
}
Serial.print(message);
// print RSSI of packet
Serial.print(" with RSSI ");
Serial.println(LoRa.packetRssi());
Serial.print("Status: ");
Serial.println(message.charAt(0));
if (message.charAt(0) == '0')
{
Serial.println(" GAZ_KAZAN");
}
else
{
Serial.println("BOILER");
}
}
}
void charoled()
{
display.clearDisplay();
display.setTextSize(2); // Normal 1:1 pixel scale
display.setTextColor(WHITE); // Draw white text
display.setCursor(0,0);
display.print(message.charAt(3));
display.print(message.charAt(4));
display.print(message.charAt(5));
display.print(message.charAt(6));
display.print(message.charAt(7));
display.println(message.charAt(8));
display.setTextSize(3); // Normal 1:1 pixel scale
display.setTextColor(WHITE); // Draw white text
display.print(message.charAt(9));
display.print(message.charAt(10));
display.print(message.charAt(11));
display.print(message.charAt(12));
display.print(message.charAt(13));
display.println(message.charAt(14));
display.print(message.charAt(15));
display.print(message.charAt(16));
display.print(message.charAt(17));
display.print(message.charAt(18));
display.print(message.charAt(19));
display.print(message.charAt(20));
display.println(message.charAt(21));
display.display();
delay(2000);
}
void rssioled()
{
display.clearDisplay();
display.setTextSize(4); // Normal 1:1 pixel scale
display.setTextColor(WHITE); // Draw white text
display.setCursor(0,0);
display.println("RSSI ");
display.print(LoRa.packetRssi());
display.display();
delay(2000);
}
void printLocalTime()
{
struct tm timeinfo;
if(!getLocalTime(&timeinfo))
{
Serial.println("Failed to obtain time");
return;
}
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
Serial.print("Day of week: ");
Serial.println(&timeinfo, "%A");
Serial.print("Month: ");
Serial.println(&timeinfo, "%B");
Serial.print("Day of Month: ");
Serial.println(&timeinfo, "%d");
Serial.print("Year: ");
Serial.println(&timeinfo, "%Y");
Serial.print("Hour: ");
Serial.println(&timeinfo, "%H");
Serial.print("Hour (12 hour format): ");
Serial.println(&timeinfo, "%I");
Serial.print("Minute: ");
Serial.println(&timeinfo, "%M");
Serial.print("Second: ");
Serial.println(&timeinfo, "%S");
Serial.println("Time variables");
char timeHour[3];
strftime(timeHour,3, "%H", &timeinfo);
Serial.println(timeHour);
char timeWeekDay[10];
strftime(timeWeekDay,10, "%A", &timeinfo);
Serial.println(timeWeekDay);
Serial.println();
}
```
A wifi működik, a LoRa vevő úgy tűnik megdöglött, van egy másik modul, abban tökéletesen fut a rá írt kód. Hamarosan érkezik egy Meshtastic T-Beam ESP32 LoRa 433 szintén a Lilygo-tól.
Remélem az tovább bírja.
Üdv.
Ma jött meg az arduino unom. A tanulásban viszont utolértem magam és szeretnék egy kicsit előre haladni. Az LCD szeretném telepíteni rá de még csak az LCD kezelés 1 oktatóanyag jött meg.
1602 i2c lcd van és ami van a tananyagban teljesen más. Semmit se csinál ezzel a programmal.
/* LiquidCrystal
LCD fuggvenykonyvtar
2x16 karakteres LCD mintaprogram
EXT1 aramkorre hangolva
60 nap alatt Arduino tanfolyam
(c) TavIR http://www.tavir.hu */
#include "LiquidCrystal.h"
// A LiquidCrystal eljarast hasznaljuk
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
// Az LCD bekotese labak szerint:
// RS(D4), E(D5), D4(D6) ,D5(D7), D6(D8), D7(D9)
void setup() {
//Inicializalas
pinMode(13, OUTPUT);
//Az LCD hattervilagitas a D13
//Csak az EXT1 lapon!
digitalWrite(13, HIGH);
// Hatter bekapcsol
lcd.begin(16, 2);
//Az LCD 2 sor, 16 oszlopos
lcd.print("Hello, World!");
//LCD-re kiirunk szoveget
}
void loop() {
//Maga a foprogram
lcd.setCursor(0, 1);
//A kiiras helye: 0. oszlop, 1. sor
lcd.print(millis()/1000);
//eltelt masodperc a bekapcsolas ota
}
Sikerült. Rossz könyvtár volt a hiba
Ez a program nem i2c modullal ellátott lcdhez való. Akkor működik helyesen, ha nem ilyen lcd-t használsz hozzá.
Igen rájöttem hogy ott a hiba. Bár kellett pár óra mire rájöttem. Taviros oktatóanyagot kezdtem meg tegnap déután eddig minden is sikerült. Led villogtatás sos módban stb. Ma jött meg az lcd kezelés 2 fejezete. Azt még be kell fejeznem.
Jó reggelt.
Mi a hiba?
Sajnos csak egész hőfokot és páratartalmat jelenít meg a küd alapján.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#define DHTPIN 2 // Kapcsold össze a DHT szenzort a digitális 2-es lábhoz
#define DHTTYPE DHT11 // DHT 11 típus
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(DHTPIN, DHTTYPE);
unsigned long previousMillisTemp = 0; // Eltelt idő az előző hőmérés óta
unsigned long previousMillisHum = 0; // Eltelt idő az előző páratartalom mérés óta
const long intervalTemp = 2000; // 2 másodperces időköz a hőméréshez
const long intervalHum = 2000; // 2 másodperces időköz a páratartalom méréshez
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Hello, Arduino!");
lcd.setCursor(0, 1);
lcd.print("I2C LCD");
dht.begin();
}
void loop() {
lcd.setCursor(0, 1);
unsigned long currentMillis = millis();
// Hőmérés minden 2 másodpercben
if (currentMillis - previousMillisTemp >= intervalTemp) {
previousMillisTemp = currentMillis;
// DHT11 szenzor olvasása
float temperatureC = dht.readTemperature();
// Ellenőrizd, hogy sikeres volt-e az olvasás
if (!isnan(temperatureC)) {
lcd.setCursor(0, 0);
lcd.print("Hommersz: ");
lcd.print(temperatureC, 1); // 1 tizedesjegyet jelenít meg
lcd.print("C");
} else {
lcd.clear(); // Kijelző törlése
lcd.setCursor(0, 0);
lcd.print("Szenzor olvasasi hiba");
}
}
// Páratartalom mérés minden 2 másodpercben
if (currentMillis - previousMillisHum >= intervalHum) {
previousMillisHum = currentMillis;
// DHT11 szenzor olvasása
float humidity = dht.readHumidity();
// Ellenőrizd, hogy sikeres volt-e az olvasás
if (!isnan(humidity)) {
lcd.setCursor(0, 1);
lcd.print("Paratart: ");
lcd.print(humidity, 1); // 1 tizedesjegyet jelenít meg
lcd.print("%");
} else {
lcd.clear(); // Kijelző törlése
lcd.setCursor(0, 0);
lcd.print("Szenzor olvasasi hiba");
}
}
delay(1000); // Var egy másodpercet
}
Sziasztok,
Arduino IDE-ben Debug-olható a Nodemcu-ra írt program?
Kösz.
Sorról sorra futtatást tudtommal egyáltalán nem támogat. Én soros portra irom a debug adatokat. Ha az túl lassú, akkor meg lehet ledet villogtatni (pl időzítésekhez) amit szkóppal nézhetsz.
szerk: az IDE2 már debuggol, noha nagyon nem mindent. Bővebben: Link A hozzászólás módosítva: Nov 13, 2023
Jó ideje kínlódok már ezzel a kóddal.
Át tudnátok nézni nekem? Sajnos a szimulációs programok nekem nem akarnak működni. Az LCD ki lesz szedve mikor beépítésre kerül a helyére ezért szükséges a led és buzzer visszajelzés.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#define DHTPIN 2 // Kapcsold össze a DHT szenzort a digitális 2-es lábhoz
#define DHTTYPE DHT11 // DHT 11 típus
#define GREEN_LED 3 // Zöld LED a 3-as digitális lábon
#define YELLOW_LED 4 // Sárga LED a 4-es digitális lábon
#define RED_LED 5 // Piros LED a 5-ös digitális lábon
#define BUZZER 6 // Buzzer a 6-os digitális lábon
#define RELAY 7 // Relé vezérlő tüske
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(DHTPIN, DHTTYPE);
unsigned long previousMillis = 0; // Eltelt idő az előző mérés óta
const long interval = 60000; // 60 másodperces időköz
const long buzzerDuration = 6000; // 6 másodperc
const long buzzerInterval = 3000; // 3 másodperc
const float hysteresis = 1.0; // Hőmérséklet hiszterézis
unsigned long buzzerTimer = 0;
bool buzzerActive = false;
bool relayState = false;
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Hello, Arduino!");
lcd.setCursor(0, 1);
lcd.print("I2C LCD");
pinMode(GREEN_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(RELAY, OUTPUT); // Relé vezérlő tüske
dht.begin();
}
void loop() {
unsigned long currentMillis = millis();
// Minden percen belül egyszer végezze el a mérést és LCD frissítést
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// Hőmérés
float temperatureC = dht.readTemperature();
if (!isnan(temperatureC)) {
lcd.setCursor(0, 0);
lcd.print("Homersek: ");
lcd.print(temperatureC, 1);
lcd.print("C");
// Zöld LED világítása 20°C vagy magasabb hőmérséklet esetén
if (temperatureC >= 20) {
digitalWrite(GREEN_LED, HIGH);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, LOW);
if (relayState) {
digitalWrite(RELAY, LOW); // Relé kikapcsolása
relayState = false;
}
}
// Sárga LED világítása 15-20°C között
else if (temperatureC >= 15 && temperatureC < 20) {
digitalWrite(GREEN_LED, LOW);
digitalWrite(YELLOW_LED, HIGH);
digitalWrite(RED_LED, LOW);
// Itt nem kell semmit tenni a relével
}
// Piros LED világítása 15°C alatti hőmérséklet esetén
else {
digitalWrite(GREEN_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, HIGH);
// Buzzer riasztás, amíg 6°C alatt van a hőmérséklet
if (temperatureC < 6) {
if (!buzzerActive) {
buzzerTimer = currentMillis;
buzzerActive = true;
}
if (currentMillis - buzzerTimer <= buzzerDuration) {
tone(BUZZER, 1000); // 1kHz frekvencia
} else if (currentMillis - buzzerTimer <= buzzerDuration + buzzerInterval) {
noTone(BUZZER); // Buzzer kikapcsolása
} else {
buzzerActive = false;
}
} else {
noTone(BUZZER); // Buzzer kikapcsolása
buzzerActive = false;
}
// Relé vezérlése hiszterézissel
if (temperatureC < 20 - hysteresis && !relayState) {
digitalWrite(RELAY, HIGH); // Relé bekapcsolása
relayState = true;
} else if (temperatureC >= 20 && relayState) {
digitalWrite(RELAY, LOW); // Relé kikapcsolása
relayState = false;
}
}
} else
A hozzászólás módosítva: Nov 14, 2023
Ha elárulnád mi a gond...
A műveleteket és biztos ami biztos bezárójelezném, hogy a műveleti sorrend úgy történjen ahogy én szeretném...
Pontosan. Jelen állapotában biztosra vehető, hogy gyakorlatilag az összes IF másképp viselkedik mint ami az elvárás. A hozzászólás módosítva: Nov 14, 2023
Még nem tudom mi lehet a hiba mert jelenleg az unot most kötöm be a feladathoz.
milyen zárójelek? Nem értem mire gondolsz.
Ha nem tudod a hibajelenséget, akkor mit is kérdezel?
Az összes if után nézd meg mit írtál, az összetartozó műveleteket zárójelezd össze aszerint, hogy szerinted milyen sorrenben hajtódjanak végre... Akkor legalább áttekinthető
pl ezt: (temperatureC < 20 - hysteresis && !relayState)
A dht11 csak ennyit tud, nézd meg a pdf-et.
Be vannak zárójelezve úgy is másoltam be. Szép zöld zárójelek.
A programod hibátlan. A DHT11 felbontása 1°C és 8 bites páratartalom, azaz csak egész értéket tud adni neked.
Köszönöm. Amire akarom használni arra tökéletes lesz a dh11. Akkumulátor melegen tartásra lesz használva és riasztani fog hogyha 6 fok vagy alatta lesz. A relé meg egy 3 izzós lámpát fog kapcsolni. 12v 5w izzók. 5cm hungarocell van burkolva.
Köszönöm mindenkinek a segítséget. Sikerült a ledeket buzert bekötni. Működik. Már csak a relét kell de már nagyon fáradt vagyok. Némi kiegészítés is került bele. Restart(nincs valós óra) és enélkül túlcsordul. Na meg egy led és buzer teszt.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#define DHTPIN 2 // Kapcsold össze a DHT szenzort a digitális 2-es lábhoz
#define DHTTYPE DHT11 // DHT 11 típus
#define GREEN_LED 3 // Zöld LED a 3-as digitális lábon
#define YELLOW_LED 4 // Sárga LED a 4-es digitális lábon
#define RED_LED 5 // Piros LED a 5-ös digitális lábon
#define BUZZER 6 // Buzzer a 6-os digitális lábon
#define RELAY 7 // Relé vezérlő tüske
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(DHTPIN, DHTTYPE);
unsigned long previousMillis = 0; // Eltelt idő az előző mérés óta
const long interval = 5000; // 5 másodperces időköz
const long buzzerDuration = 6000; // 6 másodperc
const long restartInterval = 24L * 60 * 60 * 1000; // 24 óra milliszekundumban
unsigned long buzzerTimer = 0;
bool buzzerActive = false;
bool relayState = false;
unsigned long lastRestart = 0;
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Hello, Arduino!");
lcd.setCursor(0, 1);
lcd.print("I2C LCD");
pinMode(GREEN_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(BUZZER, OUTPUT);
pinMode(RELAY, OUTPUT); // Relé vezérlő tüske
dht.begin();
// Startup függvény hívása a ledek és a buzzer bekapcsolásához
startup();
}
// Függvény az Arduino újraindításához
void restartArduino() {
asm volatile (" jmp 0");
}
// Függvény a ledek és a buzzer bekapcsolásához
void startup() {
digitalWrite(GREEN_LED, HIGH);
digitalWrite(YELLOW_LED, HIGH);
digitalWrite(RED_LED, HIGH);
// Szimulált alacsony hőmérséklet hangja
float simulatedTemperature = 5.0; // Szimulált hőmérséklet (6 fok alatt)
int frequency = map(simulatedTemperature, 0, 20, 500, 2000);
tone(BUZZER, frequency, buzzerDuration);
delay(buzzerDuration);
noTone(BUZZER);
digitalWrite(GREEN_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, LOW);
}
void loop() {
unsigned long currentMillis = millis();
// Az Arduino újraindítása 24 óránként egyszer
if (currentMillis - lastRestart >= restartInterval) {
restartArduino();
}
// Minden 5 másodpercben végezze el a mérést és LCD frissítést
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// Hőmérés
float temperatureC = dht.readTemperature();
if (!isnan(temperatureC)) {
lcd.setCursor(0, 0);
lcd.print("Homersek: ");
lcd.print(temperatureC, 1);
lcd.print("C");
// Zöld LED világítása 20°C vagy magasabb hőmérséklet esetén
if (temperatureC >= 20) {
digitalWrite(GREEN_LED, HIGH);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, LOW);
// Relé kikapcsolása, ha a hőmérséklet 20°C vagy annál magasabb
if (relayState) {
digitalWrite(RELAY, LOW);
relayState = false;
}
}
// Sárga LED világítása 15-20°C között
else if (temperatureC >= 15 && temperatureC < 20) {
digitalWrite(GREEN_LED, LOW);
digitalWrite(YELLOW_LED, HIGH);
digitalWrite(RED_LED, LOW);
// Itt nem kell semmit tenni a relével
}
// Piros LED világítása 15°C alatti hőmérséklet esetén
else {
digitalWrite(GREEN_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(RED_LED, HIGH);
// Buzzer szirénahang, amíg 6°C alatt van a hőmérséklet
if (temperatureC < 6) {
if (!buzzerActive) {
buzzerTimer = currentMillis;
buzzerActive = true;
}
if (currentMillis - buzzerTimer <= buzzerDuration) {
int frequency = map(currentMillis - buzzerTimer, 0, buzzerDuration, 500, 2000);
tone(BUZZER, frequency);
} else {
buzzerActive = false;
noTone(BUZZER); // Buzzer kikapcsolása
}
} else {
noTone(BUZZER); // Buzzer kikapcsolása
buzzerActive = false;
}
// Relé vezérlése
if (!relayState && temperatureC < 10) {
digitalWrite(RELAY, HIGH); // Relé bekapcsolása
relayState = true;
} else if (temperatureC >= 20 && relayState) {
digitalWrite(RELAY, LOW); // Relé kikapcsolása
relayState = false;
}
}
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Szenzor olvasasi hiba");
}
// LCD törlése minden mérés után
delay(2000); // Várakozás, hogy az adatok láthatók legyenek
lcd.clear();
}
}
A hozzászólás módosítva: Nov 14, 2023
Nem célszerű az adatlapon lévő értékeket meghaladni, mert ugyan működhet az alkatrész, de nagy valószínűséggel hibázni is fog. DHT11 adatlapja szerint Idézet: „Sampling period: more than 2 seconds”
A sok if helyett talán jobban áttekinthető kódot lehet készíteni a switch...case paranccsal.
Melyik értéket haladtam meg? Annyira nem ismerem még a programokat..így maradok ennél egy ideig.
|
|