Εμφάνιση ενός μόνο μηνύματος
  #123  
Παλιά 23-03-17, 12:45
Το avatar του χρήστη dkatsariotis
dkatsariotis Ο χρήστης dkatsariotis δεν είναι συνδεδεμένος
Member
 
Εγγραφή: 02-11-2013
Περιοχή: Πάτρα
Μηνύματα: 90
Προεπιλογή

Παράθεση:
Αρχική Δημοσίευση από AgMa Εμφάνιση μηνυμάτων
Να ψάξω τον κώδικα;;; Ωχ τι με βάζεις να κάνω τώρα, εκεί μέσα είναι το άδυτο .
Υπάρχει εύκολος τρόπος να τσεκάρω τα αλάρμ που λες; Μέσω σειριακής οθόνης πχ.;
Σχετικά με το ρελέ και να μην φορτωθεί το high στο digitalwrite, τι θα πάθω; Στα ρελέ θα συνδεθούν φίλτρο, κυκλοφορητής, θερμοστάτης, ανεμιστήρες, φωτισμός (αν καταφέρω να φτιάξω κώδικα ανατολής-δύσης Τ5) και ίσως η ηλεκτρομαγνητική βάνα normally closed που έχω να αδειάζω. Σε αυτή ίσως να υπάρξει θέμα, αλλά το βλέπω στην πορεία αυτό, προαιρετικό είναι.
Οι αντλίες λίπανσης δεν θα συνδεθούν με τα ρελέ.

Τα optocoupler δουλεύουν μόνιμα δηλαδή; Δεν έχω καταλάβει τον τρόπο λειτουργίας τους.

Edit: Ααα ξέχασα το σημαντικότερο!
Η λειτουργία watchdog μέχρι τώρα μου έχει δουλέψει άψογα. Όταν κάτι για κάποιο λόγο δεν έχει δουλέψει σωστά (πχ. το έχω τσεκάρει να μην φορτώνουν σωστά οι εικόνες απ' την sd και επίσης να μου δείξει περίεργα σχέδια στο μενού led graph λόγω λάθος του κώδικα) τότε κάνει επανεκκίνηση στο arduino.
Άρα υποθέτω σε λάθος φόρτωμα του κώδικα θα γίνει το ίδιο.
Ο κώδικάς του, αν μπορέσεις να καταλάβεις πως δουλεύει:

void watchdogSetup()
{
cli(); // disable all interrupts
wdt_reset(); // reset the WDT timer
MCUSR &= ~(1<<WDRF); // because the data sheet said to
/*
WDTCSR configuration:
WDIE = 1 :Interrupt Enable
WDE = 1 :Reset Enable - I won't be using this on the 2560
WDP3 = 1 :For 2000ms Time-out
WDP2 = 0 :bit pattern is
WDP1 = 0 :0111 change this for a different
WDP0 = 1 :timeout period.
*/
// Enter Watchdog Configuration mode:
WDTCSR = (1<<WDCE) | (1<<WDE);
// Set Watchdog settings: interrupte enable, 1001 for timer
WDTCSR = (1<<WDIE) | (0<<WDP3) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0);
sei();
Serial.println(F("\nFinished watchdog setup")); // just here for testing
}

ISR(WDT_vect) // Watchdog timer interrupt.
{
if(millis() - resetTime > TIMEOUTPERIOD){
resetFunc(); // This will call location zero and cause a reboot.
Το watchdog καλή δουλειά κάνει απλά δεν μας προστατεύει σε περίπτωση που το Arduino χαλάσει τελείως και το μόνο που κάνει είναι να ανάβει.

Σχετικά με τα ρελέ:

Όλα τα ρελέ 2 επαφών όπως αυτά που έχει η πλακέτα έχουν 2 καταστάσεις των επαφών, NC και NO. Όταν το ρελέ δεν έχει ρεύμα στο πηνίο του τότε η επαφή που είναι ενεργή είναι η NC. Αντίστοιχα όταν δώσουμε ρεύμα τότε η NC είναι ανενεργή και ενεργοποιείται η NO.

Στα board που έχουν optocoupler (τα μαύρα ολοκληρωμένα με τα 4 ποδαράκια) στην είσοδο του ρελέ, απομονώνουν ουσιαστικά τα ρεύματα ώστε να μην έχουμε παρεμβολές από το πηνίο του ρελέ ή να μην γίνει ζημιά σε όλη την πλακέτα σε περίπτωση βλάβης, βραχυκυκλώματος κλπ.

Στην εν λόγω πλακέτα λοιπόν τα optocoupler έχουν μόνιμα (+) από την τροφοδοσία και ενεργοποιούνται όταν πάρουν και (-) (από τα pin του Arduino). Τότε οπλίζει το ρελέ.

Στην πράξη αυτό σημαίνει πως όταν στο Arduion ένα pin δηλωθεί ως OUTPUT και είναι σε low με το digitalwrite τότε δίνει το (-) στο optocoupler και οπλίζει το ρελέ. Γιαυτό το λόγο τα κάνουμε high αμέσως μετά τη δήλωσή του pin ως OUTPUT ώστε να μην δώσουν το (-) στο optocoupler και οπλίσει το ρελέ.

Σε περίπτωση βλάβης λοιπόν του Arduino υπάρχει πάντα η πιθανότητα τα pin αυτά να "γειώσουν" (να έχουν δηλαδή το (-)) και συνεπώς να ενεργοποιήσουν τα ρελέ. Σπάνιο άλλα όχι απίθανο.

Γιαυτό πιστεύω πως η καλύτερη λύση είναι με μη isolated relay board ώστε να μην έχουμε αυτό το θέμα.

Όσο για τα alarm που ρώτησες, στο serial monitor θα δεις κάτι μόνο αν έχει το alarm κάποιο serial.print ή serial.println

Σε αντίθετη περίπτωση πρέπει να βρεις τα alarm που αντιστοιχούν στα ρελέ και να επαληθεύσεις πως όλα τα digitalwrite είναι σωστά δηλωμένα και όχι ανάποδα για το relay board που έχεις.

Συνοψίζουμε λοιπόν:

1. Αμέσως μετά τη δήλωση του ΚΑΘΕ pin για τα ρελέ, πχ pinMode(pwrLight1Pin, OUTPUT); πρέπει να βάλεις το αντίστοιχο digitalWrite(pwrLight1Pin, HIGH); για κάθε pin με τα σωστά ονόματα που έχουν δηλωθεί. Πιθανό αυτό να σου λύσει τα προβλήματα που κάποια ρελέ είναι ανοιχτά στην εκκίνηση χωρίς λόγο.

2. Στο αρχείο alarms.ino θα κοιτάξεις κάθε alarm του ρελέ ώστε να δεις αν υπάρχει το σωστό digitalwrite, πχ

void AlarmPwrCO2_On()
{
if((feedingActive==true)&&(feedSetting.pwrCO2==tru e))
{
preFeedPower.pwrCO2 = 1;
}else
{
digitalWrite(pwrCO2Pin, HIGH);
globalPower.pwrCO2=1;
}
//if (dispScreen==1) myFiles.load(206, 177, 24, 24, pwrCO2IconS[globalPower.pwrCO2]);
if (dispScreen==1) myFiles.load(178, 177, 24, 24, pwrCO2IconS[globalPower.pwrCO2]);//co2/heat swapped
}

Αντίστοιχες εγγραφές υπάρχουν για όλα τα pin των ρελέ και για την κατάσταση off, πχ void AlarmPwrCO2_Off()

Θα πρέπει να ψάξεις όλο τον κώδικα και να τον μάθεις όλο και ειδικά με τις θέσεις στην EEPROM που αποθηκεύονται οι τιμές, ώρες κλπ
Αν δεν μάθεις τι κάνει και πως η κάθε γραμμή του κώδικα δεν θα μπορέσεις να λύσεις το οποιοδήποτε θέμα σου προκύψει. Και εγώ δεν είχα ιδέα από Arduino και αυτό το project με "έκανε" να μάθω.
Απάντηση με παράθεση
 
Page generated in 0,02418 seconds with 11 queries