Hi!
I took the arrogant way of trying to learn code but there's only so far "learning by doing" and asking ChatGPT will get you. I'm a real novice when it comes to coding so see me as a "day one coder".
My buddy is all about assembeling stuff and get all the electronics, mechanics, and so on, to work, he hates code though so he asked me if i could learn some. We're trying to build a fairly primitve (both in code and hardware) water distrubution for chiliplants. Now; My question is, as ChatGPT base their answer on "plausibility" (<- Sorry, english is my 2nd language) i'm turning to you guys who actually know facts. Do you think that this code will run flawlessly or am i missing something?
Board; Arduino Uno
Microcontroller: ATmega328P
#include <avr/sleep.h>
#include <avr/power.h>
#include <EEPROM.h>
#define NUM_SENSORS 6 // Antal sensorer
#define RELAY_PIN 7 // Reläpinne
#define DRY_THRESHOLD_DEFAULT_3V3 500 // Medelvärde torrtröskel vid 3.3v drift
#define WET_THRESHOLD_DEFAULT_3V3 200 // Medelvärde våttröskel vid 3.3v drift
#define DRY_THRESHOLD_DEFAULT_5V 800 // Medelvärde torrtröskel vid 5v drift
#define WET_THRESHOLD_DEFAULT_5V 400 // Medelvärde våttröskel vid 5v drift
#define MAX_WATER_DURATION 10000 // Maxtid för bevattning
#define CHECK_INTERVAL 60 // Systemet kontrolleras var 60:e sekund..fundera på om denna ska vara kvar..
const int soilSensorPins [NUM_SENSORS] = {A0, A1, A2, A3, A4, A5};
float supplyVoltage;
bool isWatering = false;
unsigned long wateringStartTime = 0; // Tidpunkt när bevattning startade
int dryThreshold; // Lagras i EEPROM
int wetThreshold; // Lagras i EEPROM
// Deklarationer
void startWatering();
void stopWatering();
void selfCalibrate();
void saveCalibration(int dryValue, int wetValue);
void loadCalibration();
float readSupplyVoltage();
void setup() {
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
Serial.begin(9600);
Serial.println("Systemet startar...");
// Identifiera driftspänning och ställ in tröskelvärden
supplyVoltage = readSupplyVoltage();
Serial.print("Driftspänning: ");
Serial.println(supplyVoltage);
loadCalibration(); // Ladda tidigare kalibreringsvärden från EEPROM
}
void loop() {
static unsigned long previousMillis = 0;
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= (CHECK_INTERVAL * 1000)) {
previousMillis = currentMillis; // Uppdaterar tid
bool shouldWater = false;
// Kontrollera varje sensor
for (int i = 0; i < NUM_SENSORS; i++){
int soilMoistureValue = analogRead(soilSensorPins[i]);
Serial.print("Sensor ");
Serial.print(i + 1);
Serial.print(" Jordfuktighet: ");
Serial.println(soilMoistureValue);
if (soilMoistureValue < dryThreshold) {
shouldWater = true;
}
}
// Starta eller stoppa bevattning
if(shouldWater && !isWatering) {
startWatering();
} else if (!shouldWater && isWatering){
stopWatering();
}
}
}
// Funktion för att starta bevattning
void startWatering(){
digitalWrite(RELAY_PIN, HIGH);
isWatering = true;
wateringStartTime = millis();
Serial.println("Bevattning startad.");
}
// Funktion för att stoppa bevattning
void stopWatering(){
digitalWrite(RELAY_PIN, LOW);
isWatering = false;
Serial.println("Bevattning stoppad.");
}
// Funktion för självkalibrering
void selfCalibrate() {
Serial.println("Självkalibrering startar...");
int totalDry = 0, totalWet = 0;
for (int i = 0; i < NUM_SENSORS; i++) {
int dryValue = analogRead(soilSensorPins[i]);
delay(5000);
int wetValue = analogRead(soilSensorPins[i]);
Serial.print("Sensor ");
Serial.print(i + 1);
Serial.print (" Torrvärde: ");
Serial.println(dryValue);
Serial.print("Sensor ");
Serial.print(i + 1);
Serial.print(" Våtvärde: ");
Serial.println(wetValue);
totalDry += dryValue;
totalWet += wetValue;
}
dryThreshold = totalDry / NUM_SENSORS;
wetThreshold = totalWet / NUM_SENSORS;
saveCalibration(dryThreshold, wetThreshold);
}
// Funktion för att spara kalibreringsvärden till EEPROM
void saveCalibration(int dryValue, int wetValue) {
EEPROM.put(0, dryValue);
EEPROM.put(sizeof(int), wetValue);
Serial.println("Kalibreringsvärden sparade till EEPROM.");
}
// Funktion för att ladda kalibreringsvärden från EEPROM
void loadCalibration() {
EEPROM.get(0, dryThreshold);
EEPROM.get(sizeof(int), wetThreshold);
Serial.print("Laddade torrtröskel: ");
Serial.println(dryThreshold);
Serial.print("Laddade våttröskel: ");
Serial.println(wetThreshold);
}
// Funktion för att läsa driftspänning (dummyvärde här)
float readSupplyVoltage(){
return 5.0;
}
