Sari la conținut
ELFORUM - Forumul electronistilor

Nu imi merge programul


Postări Recomandate

Buna !!! Sunt incepator in Arduino si am de facut proiectul acesta.Am facut in thinkercad cu intreruperi.Cand apas o data pe buton ar trebui sa arate temperatura de la senzor1 iar cand apas a doua oara sa arate temperatura de la senzor2.Imi spuneti va rog, ce am gresit de imi dau urmatoarele erori ?Aici se poate vedea :

https://www.tinkercad.com/things/5wfJvqSCOBx-sensor-de-temp/

Link spre comentariu
  • Răspunsuri 23
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Acum 8 ore, GreenEyes2020 a spus:

Am facut in thinkercad cu intreruperi.Cand apas o data pe buton ar trebui sa arate temperatura de la senzor1 iar cand apas a doua oara sa arate temperatura de la senzor2.Imi spuneti va rog, ce am gresit de imi dau urmatoarele erori ?Aici se poate vedea :

https://www.tinkercad.com/things/5wfJvqSCOBx-sensor-de-temp/

Care erori? Cum arata sketch-ul generat (probabil) de aplicatia on-line?

OK, acum am vazut si codul. Despre asta discutam mai tarziu.

Modul de conectare al butonului este cel putin dubios! Vreau sa spun ca contactul nu este conectat la pinul digital 7 (asta este conectat permanent la +Vcc) astfel incat la apasare sa permita conectarea pinului digital 7 la +Vcc si Pin Change Interrupt sa fie activat.

Acum cu privire la sketh:

utilizarea acestei sintaxe pentru activarea intreruperii:

attachInterrupt(pin, ISR, mode)

nu este recomandata, dar se pare ca a fost folosita in sketch. Insa a fost folosita gresit pentru ca:

 attachInterrupt(0,temp,RISING);

Pinul 0 ar fi trebuit sa fie pinul care declanseaza intreruperea, insa in realizarea "practica" pinul folosit ar fi trebuit sa fie pinul digital 7. Vai, dar asta este conectat permanent la +Vcc si uC o va tine tot intr-o intrerupere (cred, nu am verificat). Pentru ca tot vorbim de pinul 7, asta nu are activata rezistenta de pull-up in program

pinMode(7, INPUT);

in loc de:

pinMode(7, INPUT_PULLUP);

Asa ca si de ar fi fot conectat corect butonul la pinul cu pricina, comportamentul uC ar fi fost bizar, ca sa nu spun haotic.

Un alt aspect ce tine tot de "folosirea" pinului 7: asta nu poate fi folosit decat cu intreruperea CHANGE (Pin Change Interrupt) pentru ca nu e asignat nici lui INT0, nici lui INT1.

Concluzia: Realizeaza fizic si electric corect montajul, inspira-te din sketch-ul propus de ciumpalac si scrie-ti propriul sketch in mod corect. Asta dupa ce te mai documentezi cum sta treaba cu intreruperile si cu structura unui program.

Incearca totusi si varianta asta (LiviuM a fost mai rapid):

int baselineTemp = 0;
int celsius = 0;
int button = 7;
int i = 0;
void setup()
{
  Serial.begin(9600);
  pinMode(A0, INPUT);
  pinMode(A5, INPUT);
  pinMode(7, INPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(9, OUTPUT);
  attachInterrupt(0, temp, RISING);
}

void loop() {
  if (button)
  {
    if (!(i == 0))
    {
      int celsius = map(((analogRead(A5) - 20) * 3.04), 0, 1023, -40, 125);
      Serial.print(celsius);
      Serial.print( "C");

      if (celsius < 20) {
        digitalWrite(2, LOW);
        digitalWrite(3, HIGH);
        digitalWrite(4, LOW);
        Serial.println("Temp de exterior  is cold ");
      }
      if (celsius > 20 && celsius < 30) {
        digitalWrite(2, HIGH);
        digitalWrite(3, LOW);
        digitalWrite(4, LOW);
        Serial.println(" Temp de exterior is fine ");

      }
      if (celsius > 30) {
        digitalWrite(2, LOW);
        digitalWrite(3, LOW);
        digitalWrite(9, HIGH);
        Serial.println(" Temp de exterior is hot");

        delay(1000);
      }
    }
  }
}
  void temp ()
  {
    if (button)
    {
      button = true;

      {
        int celsius = map(((analogRead(A5) - 20) * 3.04), 0, 1023, 0, 125);

        Serial.print(celsius);
        Serial.print( "C");

        if (celsius < 20) {
          digitalWrite(2, LOW);
          digitalWrite(3, HIGH);
          digitalWrite(4, LOW);
          Serial.println("Temp de ex is cold ");
        }
        if (celsius > 20 && celsius < 30) {
          digitalWrite(2, HIGH);
          digitalWrite(3, LOW);
          digitalWrite(4, LOW);
          Serial.println(" Temp de exterior  is fine ");

        }
        if (celsius > 30) {
          digitalWrite(2, LOW);
          digitalWrite(3, LOW);
          digitalWrite(9, HIGH);
          Serial.println(" Temp de exterior is hot ");
        }
        delay(1000);
      }
    }
  }

Poate functioneaza, nu stiu.

Editat de nico_2010
corectie
Link spre comentariu

Dupa foaia de catalog merge si pe pinul 7 (PCINT23), dar trebuie sa stii cum tratezi intreruperea.

Acum 27 minute, mihaicozac a spus:

Dacă e pe RISING întreruperea nu contează cât stă butonul în HIGH, doar momentul trecerii este luat în calcul.

Am spus ca nu stiu cum se va comporta cand gaseste 1 logic pe pin. Dupa ce am citit DS pot spune ca nu va reactiona in niciun fel, cat timp nu are loc o schimbare de nivel logic pe pinul cu pricina (poate doar o singura data, la aplicarea tensiunii de alimentare, dar nu sunt convins de asta).

Link spre comentariu
  • 2 ani mai târziu...

Va salut.

Pentru ca am o problema cu un sketch care se incadreaza la tema acestui topic, sper ca initiatorul sa nu se supere ca postez aici dar nu as vrea sa deschid un topic nou pentru atata lucru. 

Despre ce este vorba veti vedea accesand acest link.

https://wokwi.com/projects/374150153870245889

Este un simulator simplu. Si pe breadboard se comporta identic.

Ce vreau eu este ca acel cursor sa se plimbe la rotirea encoderului pe pozitia 0 numai pe liniile 1, 2 si 3. Ce gresesc? Am pus comentarii acolo unde am crezut necesar dar revin cu detalii daca este necesar.

Multumesc.

Link spre comentariu

Dis-de-dimineata, cu mintea limpede dupa prima cafeluta a zilei, am observat usor eroarea care m-a chinuit aseara.

 

Am corectat liniile 29 la 33, functia for().

Aseara era asa:
 for (int i = 0; i < NUM_OPTIONS; ++i) {
    lcd.setCursor(0, i + 1);
    lcd.print(">");
    lcd.print(options[i]);
  }
 
Acum este asa si functioneaza perfect:
 for (int i = 0; i < NUM_OPTIONS; ++i) {
    lcd.setCursor(1, i + 1);
// lcd.print(">");
    lcd.print(options[i]);
  }

 

Am corectat si in simulator:

https://wokwi.com/projects/374150153870245889

Link spre comentariu

(encoderValue + NUM_OPTIONS) % NUM_OPTIONS adauga NUM_OPTIONS (adica 3, numarul maxim de optiuni) la encoderValue, rezultatul final find astfel intotdeauna un numar pozitiv. Apoi, rezultatul este impartit la NUM_OPTIONS, restul impartirii reprezentand noua pozitie a encoderului care ramane in intervalul de la 0 la NUM_OPTIONS - 1. 

Operatorul % garanteaza ca noua pozitie se va incadra in limitele valide ale optiunilor meniului.

Link spre comentariu
Acum 3 ore, zvonacfirst a spus:

(encoderValue + NUM_OPTIONS) % NUM_OPTIONS adauga NUM_OPTIONS (adica 3, numarul maxim de optiuni) la encoderValue, rezultatul final find astfel intotdeauna un numar pozitiv. Apoi, rezultatul este impartit la NUM_OPTIONS, restul impartirii reprezentand noua pozitie a encoderului care ramane in intervalul de la 0 la NUM_OPTIONS - 1. 

Operatorul % garanteaza ca noua pozitie se va incadra in limitele valide ale optiunilor meniului.

Problema ta este ca la rotirea in sensul acelor de ceasornic valoarea variabilei"encoderValue) devine -4 la inceput, cand nu ai apucat sa misti encoderul. Asa ca nu vei obtine ceea ce iti doresti.

Incearca cu abs(encoderValue).

Link spre comentariu

Multumesc @nico_2010 dar nu stiu daca puteai sa salvezi proiectul meu. Din cate vad, proiectul al carui link l-ai postat este salvat de mine cu 19 ore in urma. In sketch nu este nimic modificat decat ce am adaugat eu ieri la sugestia lui @antemir.

 

Am incercat sa implementez functia abs(); in sketch, nu mai apar problemele generate de trecerea in negativ a valorii encoderului dar tot nu functioneaza cum trebuie.

https://wokwi.com/projects/374150153870245889 

@nico_2010, ard de nerabdare sa vad ce modificari ai facut tu in sketch asa ca te rog sa le postezi aici nu in proiect.

Editat de zvonacfirst
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări