Różnice między wybraną wersją a wersją aktualną.
Poprzednia rewizja po obu stronachPoprzednia wersjaNowa wersja | Poprzednia wersja | ||
projekty:projektsystemupomiarowokontrolnegonabaziearduino [2025/05/07 11:40] – administrator | projekty:projektsystemupomiarowokontrolnegonabaziearduino [2025/05/16 17:30] (aktualna) – administrator | ||
---|---|---|---|
Linia 1: | Linia 1: | ||
- | Jeżeli chcesz zacytować tą pracę to wejdź na zenodo.org:\\ | + | Jeżeli chcesz zacytować tą pracę to użyj indetyfikatora DOI:\\ |
- | [[https:// | + | Ostrowski, K. (2025). Projekt systemu pomiarowo-kontrolnego na bazie Arduino (Wersja 1). Zenodo. |
- | **Projekt Systemu pomiarowo-kontrolnego | + | ======= Arduino: |
****\\ | ****\\ | ||
**Kacper Ostrowski**\\ | **Kacper Ostrowski**\\ | ||
Linia 9: | Linia 9: | ||
{{fiberglass-shelter-satellite-equipment.jpg? | {{fiberglass-shelter-satellite-equipment.jpg? | ||
+ | |||
Przykład kontenera z osprzętem satelitarnym | Przykład kontenera z osprzętem satelitarnym | ||
Linia 139: | Linia 140: | ||
==== Listingi poszczególnych węzłów funkcyjnych ==== | ==== Listingi poszczególnych węzłów funkcyjnych ==== | ||
- | < | + | < |
// Extract the payload | // Extract the payload | ||
let payload = msg.payload; | let payload = msg.payload; | ||
Linia 173: | Linia 174: | ||
</ | </ | ||
- | < | + | < |
// Extract the payload (HTML content) | // Extract the payload (HTML content) | ||
let html = msg.payload; | let html = msg.payload; | ||
Linia 195: | Linia 196: | ||
</ | </ | ||
- | < | + | < |
// Initialize an empty array to store digital sensor data | // Initialize an empty array to store digital sensor data | ||
let digitalSensorsArray = []; | let digitalSensorsArray = []; | ||
Linia 218: | Linia 219: | ||
</ | </ | ||
- | < | + | < |
// Extract the digital sensors array from the incoming message payload | // Extract the digital sensors array from the incoming message payload | ||
let digitalSensorsArray = msg.payload; | let digitalSensorsArray = msg.payload; | ||
Linia 249: | Linia 250: | ||
</ | </ | ||
- | < | + | < |
// Access the temperature value from the JSON object | // Access the temperature value from the JSON object | ||
msg.payload = parseInt(msg.payload.analog_sensors[" | msg.payload = parseInt(msg.payload.analog_sensors[" | ||
Linia 258: | Linia 259: | ||
</ | </ | ||
- | < | + | < |
// Access the temperature value from the JSON object | // Access the temperature value from the JSON object | ||
msg.payload = parseInt(msg.payload.analog_sensors[" | msg.payload = parseInt(msg.payload.analog_sensors[" | ||
Linia 267: | Linia 268: | ||
</ | </ | ||
- | < | + | < |
// Access the temperature value from the JSON object | // Access the temperature value from the JSON object | ||
msg.payload = msg.payload.analog_sensors[" | msg.payload = msg.payload.analog_sensors[" | ||
Linia 277: | Linia 278: | ||
</ | </ | ||
- | < | + | < |
msg.topic = `INSERT INTO \`S5_Temperature\` (\`DATE\`, \`VALUE\`) VALUES (now(), ' | msg.topic = `INSERT INTO \`S5_Temperature\` (\`DATE\`, \`VALUE\`) VALUES (now(), ' | ||
Linia 283: | Linia 284: | ||
</ | </ | ||
- | < | + | < |
//pierwszy | //pierwszy | ||
msg.url = " | msg.url = " | ||
Linia 359: | Linia 360: | ||
==== Listingi poszczególnych węzłów funkcyjnych ==== | ==== Listingi poszczególnych węzłów funkcyjnych ==== | ||
- | < | + | < |
msg.lowerThreshold = global.get(" | msg.lowerThreshold = global.get(" | ||
msg.upperThreshold = global.get(" | msg.upperThreshold = global.get(" | ||
Linia 365: | Linia 366: | ||
</ | </ | ||
- | < | + | < |
let value = msg.payload; | let value = msg.payload; | ||
let name = msg.name; | let name = msg.name; | ||
Linia 404: | Linia 405: | ||
==== Listingi poszczególnych węzłów funkcyjnych ==== | ==== Listingi poszczególnych węzłów funkcyjnych ==== | ||
- | < | + | < |
msg.topic = `SELECT * FROM thold_log; | msg.topic = `SELECT * FROM thold_log; | ||
return msg; | return msg; | ||
Linia 421: | Linia 422: | ||
==== Listingi poszczególnych węzłów funkcyjnych ==== | ==== Listingi poszczególnych węzłów funkcyjnych ==== | ||
- | < | + | < |
msg.from = " | msg.from = " | ||
msg.topic = `Alert: ${msg.container} ${msg.name} is outside thresholds`; | msg.topic = `Alert: ${msg.container} ${msg.name} is outside thresholds`; | ||
Linia 440: | Linia 441: | ||
==== Listingi poszczególnych węzłów funkcyjnych ==== | ==== Listingi poszczególnych węzłów funkcyjnych ==== | ||
- | < | + | < |
//bloki lower | //bloki lower | ||
global.set(" | global.set(" | ||
Linia 459: | Linia 460: | ||
==== Listingi poszczególnych węzłów funkcyjnych ==== | ==== Listingi poszczególnych węzłów funkcyjnych ==== | ||
- | < | + | < |
msg.from = " | msg.from = " | ||
msg.topic = `Alert: ${msg.container} digital sensors changed status`; | msg.topic = `Alert: ${msg.container} digital sensors changed status`; | ||
Linia 515: | Linia 516: | ||
Każde z tych wywołań skutkuje wygenerowaniem osobnego wykresu z ostatnich 24 godzin dla danego parametru. | Każde z tych wywołań skutkuje wygenerowaniem osobnego wykresu z ostatnich 24 godzin dla danego parametru. | ||
- | < | + | < |
import pymysql | import pymysql | ||
import matplotlib.pyplot as plt | import matplotlib.pyplot as plt | ||
Linia 597: | Linia 598: | ||
===== Wykaz załączników ===== | ===== Wykaz załączników ===== | ||
- | - Kod dla platformy Arduino MEGA '' | + | |
- | - Skrypt bazy danych oraz dane które system zebrał | + | |
+ | <code cpp arduino.ino> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | |||
+ | AVT5636 myBoard; | ||
+ | Servo myServo; | ||
+ | |||
+ | SimpleDHT11 dht11; | ||
+ | |||
+ | byte mac[] = { | ||
+ | 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED | ||
+ | }; | ||
+ | IPAddress ip(192, 168, 80, 53); | ||
+ | |||
+ | // Initialize the Ethernet server library | ||
+ | EthernetServer server(8080); | ||
+ | |||
+ | float temperature; | ||
+ | float humidity; | ||
+ | |||
+ | int term2=0; | ||
+ | int term3=0; | ||
+ | int term4=0; | ||
+ | int term5=0; | ||
+ | |||
+ | uint32_t prevMillis = millis(); | ||
+ | |||
+ | |||
+ | void setup() { | ||
+ | pinMode(22, INPUT_PULLUP); | ||
+ | pinMode(24, INPUT_PULLUP); | ||
+ | pinMode(26, INPUT_PULLUP); | ||
+ | pinMode(28, INPUT_PULLUP); | ||
+ | pinMode(30, INPUT_PULLUP); | ||
+ | myBoard.init(); | ||
+ | myServo.attach(PULSE2_PIN); | ||
+ | // | ||
+ | |||
+ | // | ||
+ | //while (!Serial) { | ||
+ | // ; // wait for serial port to connect. Needed for native USB port only | ||
+ | //} | ||
+ | |||
+ | Ethernet.begin(mac, | ||
+ | server.begin(); | ||
+ | // | ||
+ | // | ||
+ | |||
+ | } | ||
+ | |||
+ | String HTTP_req; | ||
+ | bool LED_status4 = 0; | ||
+ | bool LED_status3 = 0; | ||
+ | bool LED_status2 = 0; | ||
+ | |||
+ | int IntTemperature; | ||
+ | int IntHumidity; | ||
+ | |||
+ | unsigned long previousMillis = 0; | ||
+ | |||
+ | float CurrentSensor = 0; | ||
+ | |||
+ | void loop() { | ||
+ | CurrentSensor = ((5.0/ | ||
+ | // | ||
+ | |||
+ | LED_status4 = 0; | ||
+ | LED_status3 = 0; | ||
+ | |||
+ | unsigned long currentMillis = millis(); | ||
+ | |||
+ | if (currentMillis - previousMillis >= 60000) { | ||
+ | |||
+ | previousMillis = currentMillis; | ||
+ | delay(2000); | ||
+ | |||
+ | byte temperature = 0; | ||
+ | byte humidity = 0; | ||
+ | byte err = SimpleDHTErrSuccess; | ||
+ | |||
+ | if ((err = dht11.read(31, | ||
+ | // | ||
+ | // | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | IntTemperature = temperature; | ||
+ | IntHumidity = humidity; | ||
+ | term2 = temperature; | ||
+ | term3 = humidity; | ||
+ | } | ||
+ | |||
+ | |||
+ | term4 = 444; | ||
+ | term5 = 555; | ||
+ | |||
+ | EthernetClient a = server.available(); | ||
+ | serveWebsite(a); | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | EthernetClient serveWebsite(EthernetClient client){ | ||
+ | if (client) { | ||
+ | // | ||
+ | bool currentLineIsBlank = true; | ||
+ | while (client.connected()) { | ||
+ | // | ||
+ | if (client.available()) { | ||
+ | // | ||
+ | char c = client.read(); | ||
+ | // | ||
+ | HTTP_req += c; | ||
+ | if (c == '\n' | ||
+ | // | ||
+ | if (HTTP_req.indexOf(" | ||
+ | if (HTTP_req.indexOf(" | ||
+ | if (HTTP_req.indexOf(" | ||
+ | if (HTTP_req.indexOf(" | ||
+ | if (HTTP_req.indexOf(" | ||
+ | if (HTTP_req.indexOf(" | ||
+ | |||
+ | client.println(F(" | ||
+ | client.println(" | ||
+ | client.println(" | ||
+ | // | ||
+ | client.println(); | ||
+ | client.println("< | ||
+ | client.println("< | ||
+ | client.println("< | ||
+ | client.println("< | ||
+ | // client.println("< | ||
+ | // client.println(" | ||
+ | // client.println(" | ||
+ | // client.println(" | ||
+ | // client.println(" | ||
+ | // client.println(" | ||
+ | // client.println(" | ||
+ | // client.println(" | ||
+ | // client.println(" | ||
+ | // client.println(" | ||
+ | // client.println(" | ||
+ | // client.println(" | ||
+ | // client.println("</ | ||
+ | client.println("</ | ||
+ | client.println("< | ||
+ | client.println("< | ||
+ | client.println("< | ||
+ | client.println("< | ||
+ | client.println("< | ||
+ | client.println("< | ||
+ | client.println("< | ||
+ | client.println("< | ||
+ | |||
+ | client.println("< | ||
+ | client.println("< | ||
+ | |||
+ | client.println("< | ||
+ | client.println("</ | ||
+ | client.println("< | ||
+ | client.println("< | ||
+ | client.println("< | ||
+ | client.print("< | ||
+ | client.print(digitalRead(22)); | ||
+ | client.println("</ | ||
+ | client.print("< | ||
+ | client.print(digitalRead(24)); | ||
+ | client.println("</ | ||
+ | client.print("< | ||
+ | client.print(digitalRead(26)); | ||
+ | client.println("</ | ||
+ | client.print("< | ||
+ | client.print(digitalRead(28)); | ||
+ | client.println("</ | ||
+ | client.print("< | ||
+ | client.print(digitalRead(30)); | ||
+ | client.println("</ | ||
+ | client.println("</ | ||
+ | client.println("< | ||
+ | client.println(" | ||
+ | client.println("< | ||
+ | |||
+ | // LED4 control and mode selection | ||
+ | client.println("< | ||
+ | //client.println("< | ||
+ | |||
+ | if (LED_status4) { | ||
+ | myBoard.ledOn(4); | ||
+ | delay(3000); | ||
+ | myBoard.ledOff(4); | ||
+ | delay(3000); | ||
+ | } else { | ||
+ | myBoard.ledOff(4); | ||
+ | } | ||
+ | |||
+ | // LED3 control and mode selection | ||
+ | client.println("< | ||
+ | // | ||
+ | |||
+ | |||
+ | if (LED_status3) { | ||
+ | myBoard.ledOn(3); | ||
+ | delay(3000); | ||
+ | myBoard.ledOff(3); | ||
+ | delay(3000); | ||
+ | } else { | ||
+ | myBoard.ledOff(3); | ||
+ | } | ||
+ | |||
+ | // LED2 control and mode selection | ||
+ | client.println("< | ||
+ | client.println("< | ||
+ | |||
+ | |||
+ | if (LED_status2) { | ||
+ | myBoard.ledOn(2); | ||
+ | client.println("< | ||
+ | } else { | ||
+ | myBoard.ledOff(2); | ||
+ | client.println("< | ||
+ | } | ||
+ | |||
+ | client.println("</ | ||
+ | client.println("</ | ||
+ | client.println("</ | ||
+ | client.println("</ | ||
+ | |||
+ | HTTP_req = ""; | ||
+ | break; | ||
+ | } | ||
+ | if (c == ' | ||
+ | currentLineIsBlank = true; | ||
+ | } else if (c != ' | ||
+ | currentLineIsBlank = false; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | client.stop(); | ||
+ | |||
+ | // | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||