vfr;
Menar du med motståndet vid "larmkontakten"? Eller menar du det tillsammans med mitt schema kanske?
Swech;
Nej det förstår jag också, lite svårt att tillfredsställa alla genom att ha alla komponenter som
finns på marknaden hemma

Blir lite väl stort lager då kanske
Ja det förstås, jag ska ju inte låsa mig fast vid just ATmega32, men menade bara att eftersom jag har
den hemma så blir det den första jag arbetar mot. Sen skulle man ju kunna tänka sig att ATmega32 sitter i en
"central" dit man kopplar "undercentraler".
Ungefär som att varje ADC pinne på ATmega32an i huvudcentralen utgör ett rum, i varje rum sitter sedan en
undercentral baserad på valfri ny atmel som har en sladd som går till huvudcentralen. I varje undercentral kan
man då koppla in flera olika sensorer.
Det går säkerligen att ordna så man kan se vilken sensor som triggar i undercentralen på en display på huvudcentralen
men i enklaste fallet så ser man bara vilken undercentral som larmar. Då får man gå dit och på undercentralen kanske
det sitter en lysdiod för varje inkopplad sensor så man ser vilken som larmar, alternativt ser man att ett fönster
står öppet
Lite överkurs nu innan man får ordning på det första

Men om vi säger att jag börjar med att scanna alla ingångar, 100 ggr/sek, då är det mitt schema jag ska gå
efter och skapa en logisk etta för att kunna använda så många I/O pinnar som möjligt?
Ja det förstås, jag blandar säkert ihop det med tjocka högtalarkablar som i sig är motstånd, inte sant?
Så för att skydda sig, vad kan man använda då? Gud det känns som om jag glömt allt från när jag jobbade med elektronik.
10.000V är ju rätt mycket, men det är ju klart att man ska skydda sig för att vara så säker som möjligt.
Jag tänkte på kondensator som stabiliserar kraftiga spikar, men det är väl inte det man ska använda sig av?
Om man nu tänker på att en vanlig kondensator ligger på mellan 16-300V? Så borde en 10kV vara rätt dyr
Ampere kan man inte räkna med heller eftersom det förmodligen är väldigt lågt, inte direkt så att tjuven tar med
sig larmsystemet till ett elkraftverk för att slå ut det med största möjliga effekt

Så säkringar är inte att tänka på, eller hur?
Men om nu någon drar in 10kV i en signalkabel och vi har ett lämpligt skydd mot det, då borde man väl kunna
upptäcka det och dra larmet ändå?
Bara en tanke med kodningen för att läsa av pinnarna och se om något är fel;
Kod: Markera allt
startpinne = 0;
maxpinnar = 20;
räknare = 0;
while(1)
{
if ( pinne[räknare] == 0 )
{
larma(räknare);
}
if ( räknare == maxpinnar )
{
räknare=0;
}
else
{
räknare++;
}
}
funktion larma(larmpinne)
{
aktivera_utpinne_siren;
skriv_till_lcd('Larm på pinne'.larmpinne);
** vänta
}
Har jag förstått det någorlunda rätt med ovanstående kod? Hur ska jag se till att processorn väntar på "** vänta"
utan att stoppa processorn så den inte går vidare med att söka av pinnar?
Fast å andra sidan kanske den ska fortsätta söka av pinnar utifall mer händer, kanske rörelsesensor går av, annat
fönster öppnas och så vidare?
Kod: Markera allt
startpinne = 0;
maxpinnar = 20;
räknare = 0;
antal_larm = 0;
while(1)
{
if ( pinne[räknare] == 0 )
{
larma(räknare);
}
if ( räknare == maxpinnar )
{
räknare=0;
}
else
{
räknare++;
}
}
funktion larma(larmpinne)
{
if ( register[larmpinne] != 1 )
{
antal_larm++;
aktivera_utpinne_siren;
if ( antal_larm > 1 )
{
skriv_till_lcd('Flera larm utlösta!');
}
else
{
skriv_till_lcd('Larm på pinne'.larmpinne);
}
}
}
Ovanstående kod gör ju så att scannern fortsätter att scanna av, men larmar bara en gång per pinne, till det att
man återställt larmet. Då flera larm har blivit utlösta så visas att flera larm utlöst och sen får man gå in i en
meny för att se samtliga larm, altenativt att man har en larmpanel med lysdioder för varje larmpinne/sektion.
Förresten, vad tror / tycker ni fungerar bäst, en integer man plussar på, som i mina exempel eller byter ut det
mot en For loop? En integer som adderas gör ju att while loopen är öppen, medan en For loop gör så att koden fastnar
i For tills det att den har räknat igenom alla pinnar. Eller fungerar det inte så i C?
Jag jämför lite med PHP och tänker på hur det fungerar där, därför kanske jag tänker fel.
Här som lovat trycker jag även in koden som jag hade på programmeringsdatorn, såg att ADMUX var satt till
Har inte hunnit testa vad skillnaden blir med ett & och ett ~ tecken gör, men får ta och testa det sen!
Koden nedan är hur som helst den jag pratade om där jag bara kunde läsa av en ADC kanal åt gången, tanken är att
när jag rör på en pot så ska displayen visa värdet från potten medan man ändrar värdet samt vänta kvar 2-3 sekunder
för att sen återgå till ett "standby" läge.
Visst det gör den, i stort sett, fast att vänta 2-3 sekunder vill den inte. Jag la det projektet lite åt sidan nu när
jag fastnade i det här "larm" projektet

Men kan ju vara roligt om det nu är så enkelt att bara ändra ADC pinne med
en while loop och på så sätt kunna lyckas läsa av alla tre pottar
Men men, nu ska jag sluta svamla med en massa idéer och frågor, här kommer koden, dock inte headers och så, men i
stort sett allt är väl med;
Kod: Markera allt
int main(void)
{
DDRD = 0xFF;
PORTD = 0x00;
// Value for the register, placeholder
uint8_t value = 0;
uint8_t valuecompare = 0;
uint16_t countTime = 32000;
uint16_t icount = 0;
uint16_t icountduplicator = 0;
char intstr;
int firststart = 0;
char buffer [33];
// -------------------------
// Initialize PWM
// 8-bit PWM, Phase correct
// 8 bits give us 256 levels of brightness
TCCR1A |= (1<<WGM10);
// Clear OC1A/OC1B on Compare Match
// Set OC1A/OC1B at BOTTOM (non-inverting mode)
TCCR1A |= (1<<COM1A1);
// Set prescaler to 8
// 1 MHz / 8*256 = ~490 Hz PWM frequency
TCCR1B |= (1<<CS11);
// -------------------------
// Initialize ADC
// Enable ADC
ADCSRA = (1<<ADEN);
// Select ADC0
ADMUX |= (1<<MUX0);
// Use Vcc as voltage reference
ADMUX &= ~(1<<REFS1) | ~(1<<REFS0);
// Select divider factor 8, so we get 1 MHz/8 = 125 kHz ADC clock
//ADCSRA |= (1<<ADPS1) | (1<<ADPS0);
ADCSRA = 0xEE;
// Left adjust ADC result to allow easy 8 bit reading
ADMUX |= (1 << ADLAR);
/* initialize display, cursor off */
lcd_init(LCD_DISP_ON);
lcd_clrscr();
lcd_puts("Startup message\nHello World?!");
_delay_ms(6000);
// Clear display and cursor position
lcd_clrscr();
// Put string to display
//lcd_puts("Controller\n");
while (1) // loop forever
{
// Write the value to the Output Compare Register A
//OCR1A = value;
OCR1B = value;
OCR2 = value;
// what happens here??
value = ADCH;
// Start ADC conversion
ADCSRA |= (1<<ADSC);
// has the value changed? if so, update the LCD display
if ( value != valuecompare )
{
lcd_gotoxy(0,0);
lcd_puts("Action done.. ");
// Goto this position; Character 1, Line 2
lcd_gotoxy(0,1);
// Put string to display
lcd_puts("Volume:");
// Goto this position; Character 9, Line 2
lcd_gotoxy(8,1);
// Convert string to integer
intstr = itoa(value,buffer,10);
// Write buffer to display
lcd_puts(" ");
lcd_gotoxy(8,1);
lcd_puts(buffer);
// Set the value to compare with, to see if value has changed
// if it has changed it will update the LCD display
valuecompare = value;
icount=0;
}
if ( icount != countTime )
{
while( icount <= countTime )
{
if ( icount == countTime )
{
lcd_clrscr();
lcd_puts("Controller ready!:");
icountduplicator=0;
}
icount++;
}
}
if ( firststart == 0 )
{
lcd_clrscr();
lcd_puts("Controller ready!:");
firststart = 1;
}
}
}