desktop

Puerta automática para gallinero

el .c no lo copies, el IDE de Arduino podría intentar compilarlo y causar error porque es para windows, es solo para que puedas ver el código, solo copia el exe y el bat y eso pasa los comandos para que se regenere el archivo .h
así como lo abriste esta bien, intentaba reorganizar el código del html, prueba con este
HTML:
<!doctype html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>GALLINER LOS QUINTOS</title>
    <style>
        body {
            font-family: Arial, Helvetica, sans-serif;
            background: #181818;
            color: #EFEFEF;
            font-size: 16px
        }

        h2 {
            font-size: 18px
        }

        section.main {
            display: flex
        }

        #menu,
        section.main {
            flex-direction: column
        }

        #menu {
            display: none;
            flex-wrap: nowrap;
            min-width: 340px;
            background: #363636;
            padding: 8px;
            border-radius: 4px;
            margin-top: -10px;
            margin-right: 10px
        }

        #content {
            display: flex;
            flex-wrap: wrap;
            align-items: stretch
        }

        figure {
            padding: 0;
            margin: 0;
            -webkit-margin-before: 0;
            margin-block-start: 0;
            -webkit-margin-after: 0;
            margin-block-end: 0;
            -webkit-margin-start: 0;
            margin-inline-start: 0;
            -webkit-margin-end: 0;
            margin-inline-end: 0
        }

        figure img {
            display: block;
            width: 100%;
            height: auto;
            border-radius: 4px;
            margin-top: 8px
        }

        @media (min-width: 800px) and (orientation:landscape) {
            #content {
                display: flex;
                flex-wrap: nowrap;
                align-items: stretch
            }

            figure img {
                display: block;
                max-width: 100%;
                max-height: calc(100vh - 40px);
                width: auto;
                height: auto
            }

            figure {
                padding: 0;
                margin: 0;
                -webkit-margin-before: 0;
                margin-block-start: 0;
                -webkit-margin-after: 0;
                margin-block-end: 0;
                -webkit-margin-start: 0;
                margin-inline-start: 0;
                -webkit-margin-end: 0;
                margin-inline-end: 0
            }
        }

        section#buttons {
            display: flex;
            flex-wrap: nowrap;
            justify-content: space-between
        }

        #nav-toggle {
            cursor: pointer;
            display: block
        }

        #nav-toggle-cb {
            outline: 0;
            opacity: 0;
            width: 0;
            height: 0
        }

        #nav-toggle-cb:checked+#menu {
            display: flex
        }

        .input-group {
            display: flex;
            flex-wrap: nowrap;
            line-height: 22px;
            margin: 5px 0
        }

        .input-group>label {
            display: inline-block;
            padding-right: 10px;
            min-width: 47%
        }

        .input-group input,
        .input-group select {
            flex-grow: 1
        }

        .range-max,
        .range-min {
            display: inline-block;
            padding: 0 5px
        }

        button {
            display: block;
            margin: 5px;
            padding: 0 12px;
            border: 0;
            line-height: 28px;
            cursor: pointer;
            color: #fff;
            background: #ff3034;
            border-radius: 5px;
            font-size: 16px;
            outline: 0
        }

        button:hover {
            background: #ff494d
        }

        button:active {
            background: #f21c21
        }

        button.disabled {
            cursor: default;
            background: #a0a0a0
        }

        input[type=range] {
            -webkit-appearance: none;
            width: 100%;
            height: 22px;
            background: #363636;
            cursor: pointer;
            margin: 0
        }

        input[type=range]:focus {
            outline: 0
        }

        input[type=range]::-webkit-slider-runnable-track {
            width: 100%;
            height: 2px;
            cursor: pointer;
            background: #EFEFEF;
            border-radius: 0;
            border: 0 solid #EFEFEF
        }

        input[type=range]::-webkit-slider-thumb {
            border: 1px solid rgba(0, 0, 30, 0);
            height: 22px;
            width: 22px;
            border-radius: 50px;
            background: #ff3034;
            cursor: pointer;
            -webkit-appearance: none;
            margin-top: -11.5px
        }

        input[type=range]:focus::-webkit-slider-runnable-track {
            background: #EFEFEF
        }

        input[type=range]::-moz-range-track {
            width: 100%;
            height: 2px;
            cursor: pointer;
            background: #EFEFEF;
            border-radius: 0;
            border: 0 solid #EFEFEF
        }

        input[type=range]::-moz-range-thumb {
            border: 1px solid rgba(0, 0, 30, 0);
            height: 22px;
            width: 22px;
            border-radius: 50px;
            background: #ff3034;
            cursor: pointer
        }

        input[type=range]::-ms-track {
            width: 100%;
            height: 2px;
            cursor: pointer;
            background: 0 0;
            border-color: transparent;
            color: transparent
        }

        input[type=range]::-ms-fill-lower {
            background: #EFEFEF;
            border: 0 solid #EFEFEF;
            border-radius: 0
        }

        input[type=range]::-ms-fill-upper {
            background: #EFEFEF;
            border: 0 solid #EFEFEF;
            border-radius: 0
        }

        input[type=range]::-ms-thumb {
            border: 1px solid rgba(0, 0, 30, 0);
            height: 22px;
            width: 22px;
            border-radius: 50px;
            background: #ff3034;
            cursor: pointer;
            height: 2px
        }

        input[type=range]:focus::-ms-fill-lower {
            background: #EFEFEF
        }

        input[type=range]:focus::-ms-fill-upper {
            background: #363636
        }

        .switch {
            display: block;
            position: relative;
            line-height: 22px;
            font-size: 16px;
            height: 22px
        }

        .switch input {
            outline: 0;
            opacity: 0;
            width: 0;
            height: 0
        }

        .slider {
            width: 50px;
            height: 22px;
            border-radius: 22px;
            cursor: pointer;
            background-color: grey
        }

        .slider,
        .slider:before {
            display: inline-block;
            transition: .4s
        }

        .slider:before {
            position: relative;
            content: "";
            border-radius: 50%;
            height: 16px;
            width: 16px;
            left: 4px;
            top: 3px;
            background-color: #fff
        }

        input:checked+.slider {
            background-color: #ff3034
        }

        input:checked+.slider:before {
            -webkit-transform: translateX(26px);
            transform: translateX(26px)
        }

        select {
            border: 1px solid #363636;
            font-size: 14px;
            height: 22px;
            outline: 0;
            border-radius: 5px
        }

        .image-container {
            position: relative;
            min-width: 160px
        }

        .close {
            position: absolute;
            right: 5px;
            top: 5px;
            background: #ff3034;
            width: 16px;
            height: 16px;
            border-radius: 100px;
            color: #fff;
            text-align: center;
            line-height: 18px;
            cursor: pointer
        }

        .hidden {
            display: none
        }
    </style>
</head>

<body>
    <figure>
        <div id="stream-container" class="image-container hidden">
            <div class="close" id="close-stream">×</div>
            <img id="stream" src="">
        </div>
    </figure>



    <h1 style="color:green; font-size:5;">...GALLINERO LOS QUINTOS...</h1>




    <section class="main">
        <section id="buttons">
            <table>
                <tr>
                    <td><button id="get-still" style="text-align:center">IMAGEN</button></td>
                    <td></td>
                    <td><button id="toggle-stream" style="text-align:center">CAMARA</button></td>
                </tr>

                <tr>
                    <td></td>
                </tr>

                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                    <td style="text-align:center"><button id="forward"
                            onclick="fetch(document.location.origin+'/control?var=car&val=1');">ABRE</button></td>
                    <td></td>
                </tr>

                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>

                <tr>
                    <td></td>
                    <td style="text-align:center"><button id="backward"
                            onclick="fetch(document.location.origin+'/control?var=car&val=5');">CIERRA</button></td>
                <tr>
                    </td>
                </tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                </td>
                <tr>
                    </td>
                </tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>

                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>




                <tr>
                    <td>LUZ</td>
                    <td style="text-align:center" colspan="2"><input type="range" id="flash" min="0" max="255" value="0"
                            onchange="try{fetch(document.location.origin+'/control?var=flash&val='+this.value);}catch(e){}">
                    </td>
                </tr>
                <tr>
                    </td>
                </tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                </td>
                <tr>
                    </td>
                </tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td>CALIDAD</td>
                    <td style="text-align:center" colspan="2"><input type="range" id="quality" min="10" max="63"
                            value="10"
                            onchange="try{fetch(document.location.origin+'/control?var=quality&val='+this.value);}catch(e){}">
                    </td>
                </tr>




                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>



            </table>



        </section>
    </section>



    <p style="color:#FFFFFF; font-size:2">Exclusivo Para Ignacio Carrasco, by A.Del Río</p>


    <script>
        document.addEventListener('DOMContentLoaded', function () {
            function b(B) {
                let C;
                switch (B.type) {
                    case 'checkbox': C = B.checked ? 1 : 0;
                        break;
                    case 'range':
                    case 'select-one': C = B.value;
                        break;
                    case 'button':
                    case 'submit': C = '1';
                        break;
                    default: return;
                }
                const D = `${c}/control?var=${B.id}&val=${C}`;
                fetch(D).then(E => { console.log(`request to ${D} finished, status: ${E.status}`); })
            }
            var c = document.location.origin;
            const e = B => { B.classList.add('hidden') },
                f = B => { B.classList.remove('hidden') },
                g = B => {
                    B.classList.add('disabled'),
                        B.disabled = !0
                },
                h = B => { B.classList.remove('disabled'), B.disabled = !1 },
                i = (B, C, D) => {
                    D = !(null != D) || D;
                    let E;
                    'checkbox' === B.type ? (E = B.checked, C = !!C, B.checked = C) : (E = B.value, B.value = C),
                        D && E !== C ? b(B) : !D && ('aec' === B.id ? C ? e(v) : f(v) : 'agc' === B.id ? C ? (f(t), e(s)) : (e(t), f(s)) : 'awb_gain' === B.id ? C ? f(x) : e(x) : 'face_recognize' === B.id && (C ? h(n) : g(n)))
                };
            document.querySelectorAll('.close').forEach(B => { B.onclick = () => { e(B.parentNode) } }),
                fetch(`${c}/status`).then(function (B) { return B.json() }).then(function (B) { document.querySelectorAll('.default-action').forEach(C => { i(C, B[C.id], !1) }) });
            const j = document.getElementById('stream'),
                k = document.getElementById('stream-container'),
                l = document.getElementById('get-still'),
                m = document.getElementById('toggle-stream'),
                n = document.getElementById('face_enroll'),
                o = document.getElementById('close-stream'),
                p = () => {
                    window.stop(),
                        m.innerHTML = 'CAMARA'
                },
                q = () => {
                    j.src = `${c + ':8555'}/stream`,
                        f(k), m.innerHTML = 'DIRECTO'
                };
            l.onclick = () => {
                p(), j.src = `${c}/capture?_cb=${Date.now()}`,
                    f(k)
            },
                o.onclick = () => {
                    p(),
                        e(k)
                },
                m.onclick = () => {
                    const B = 'Stop Stream' === m.innerHTML;
                    B ? p() : q()
                },
                n.onclick = () => { b(n) },
                document.querySelectorAll('.default-action').forEach(B => { B.onchange = () => b(B) });
            const r = document.getElementById('agc'),
                s = document.getElementById('agc_gain-group'),
                t = document.getElementById('gainceiling-group');
            r.onchange = () => {
                b(r),
                    r.checked ? (f(t), e(s)) : (e(t), f(s))
            };
            const u = document.getElementById('aec'),
                v = document.getElementById('aec_value-group');
            u.onchange = () => {
                b(u),
                    u.checked ? e(v) : f(v)
            };
            const w = document.getElementById('awb_gain'),
                x = document.getElementById('wb_mode-group');
            w.onchange = () => {
                b(w),
                    w.checked ? f(x) : e(x)
            };
            const y = document.getElementById('face_detect'),
                z = document.getElementById('face_recognize'),
                A = document.getElementById('framesize');
            A.onchange = () => {
                b(A),
                    5 < A.value && (i(y, !1), i(z, !1))
            },
                y.onchange = () => {
                    return 5 < A.value ? (alert('Please select CIF or lower resolution before enabling this feature!'),
                        void i(y, !1)) : void (b(y), !y.checked && (g(n), i(z, !1)))
                },
                z.onchange = () => {
                    return 5 < A.value ? (alert('Please select CIF or lower resolution before enabling this feature!'),
                        void i(z, !1)) : void (b(z),
                            z.checked ? (h(n), i(y, !0)) : g(n))
                }
        });

    </script>
</body>

</html>
traté de separar las funciones del script para que sea más entendible, pero es mi amiga la que sabe de esta modalidad, a mí me confunde esta forma de script. También realicé algunas correcciones al HTML porque está con el formato del 5 pero usaba sintaxis del 4.
 
el .c no lo copies, el IDE de Arduino podría intentar compilarlo y causar error porque es para windows, es solo para que puedas ver el código, solo copia el exe y el bat y eso pasa los comandos para que se regenere el archivo .h
así como lo abriste esta bien, intentaba reorganizar el código del html, prueba con este
HTML:
<!doctype html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>GALLINER LOS QUINTOS</title>
    <style>
        body {
            font-family: Arial, Helvetica, sans-serif;
            background: #181818;
            color: #EFEFEF;
            font-size: 16px
        }

        h2 {
            font-size: 18px
        }

        section.main {
            display: flex
        }

        #menu,
        section.main {
            flex-direction: column
        }

        #menu {
            display: none;
            flex-wrap: nowrap;
            min-width: 340px;
            background: #363636;
            padding: 8px;
            border-radius: 4px;
            margin-top: -10px;
            margin-right: 10px
        }

        #content {
            display: flex;
            flex-wrap: wrap;
            align-items: stretch
        }

        figure {
            padding: 0;
            margin: 0;
            -webkit-margin-before: 0;
            margin-block-start: 0;
            -webkit-margin-after: 0;
            margin-block-end: 0;
            -webkit-margin-start: 0;
            margin-inline-start: 0;
            -webkit-margin-end: 0;
            margin-inline-end: 0
        }

        figure img {
            display: block;
            width: 100%;
            height: auto;
            border-radius: 4px;
            margin-top: 8px
        }

        @media (min-width: 800px) and (orientation:landscape) {
            #content {
                display: flex;
                flex-wrap: nowrap;
                align-items: stretch
            }

            figure img {
                display: block;
                max-width: 100%;
                max-height: calc(100vh - 40px);
                width: auto;
                height: auto
            }

            figure {
                padding: 0;
                margin: 0;
                -webkit-margin-before: 0;
                margin-block-start: 0;
                -webkit-margin-after: 0;
                margin-block-end: 0;
                -webkit-margin-start: 0;
                margin-inline-start: 0;
                -webkit-margin-end: 0;
                margin-inline-end: 0
            }
        }

        section#buttons {
            display: flex;
            flex-wrap: nowrap;
            justify-content: space-between
        }

        #nav-toggle {
            cursor: pointer;
            display: block
        }

        #nav-toggle-cb {
            outline: 0;
            opacity: 0;
            width: 0;
            height: 0
        }

        #nav-toggle-cb:checked+#menu {
            display: flex
        }

        .input-group {
            display: flex;
            flex-wrap: nowrap;
            line-height: 22px;
            margin: 5px 0
        }

        .input-group>label {
            display: inline-block;
            padding-right: 10px;
            min-width: 47%
        }

        .input-group input,
        .input-group select {
            flex-grow: 1
        }

        .range-max,
        .range-min {
            display: inline-block;
            padding: 0 5px
        }

        button {
            display: block;
            margin: 5px;
            padding: 0 12px;
            border: 0;
            line-height: 28px;
            cursor: pointer;
            color: #fff;
            background: #ff3034;
            border-radius: 5px;
            font-size: 16px;
            outline: 0
        }

        button:hover {
            background: #ff494d
        }

        button:active {
            background: #f21c21
        }

        button.disabled {
            cursor: default;
            background: #a0a0a0
        }

        input[type=range] {
            -webkit-appearance: none;
            width: 100%;
            height: 22px;
            background: #363636;
            cursor: pointer;
            margin: 0
        }

        input[type=range]:focus {
            outline: 0
        }

        input[type=range]::-webkit-slider-runnable-track {
            width: 100%;
            height: 2px;
            cursor: pointer;
            background: #EFEFEF;
            border-radius: 0;
            border: 0 solid #EFEFEF
        }

        input[type=range]::-webkit-slider-thumb {
            border: 1px solid rgba(0, 0, 30, 0);
            height: 22px;
            width: 22px;
            border-radius: 50px;
            background: #ff3034;
            cursor: pointer;
            -webkit-appearance: none;
            margin-top: -11.5px
        }

        input[type=range]:focus::-webkit-slider-runnable-track {
            background: #EFEFEF
        }

        input[type=range]::-moz-range-track {
            width: 100%;
            height: 2px;
            cursor: pointer;
            background: #EFEFEF;
            border-radius: 0;
            border: 0 solid #EFEFEF
        }

        input[type=range]::-moz-range-thumb {
            border: 1px solid rgba(0, 0, 30, 0);
            height: 22px;
            width: 22px;
            border-radius: 50px;
            background: #ff3034;
            cursor: pointer
        }

        input[type=range]::-ms-track {
            width: 100%;
            height: 2px;
            cursor: pointer;
            background: 0 0;
            border-color: transparent;
            color: transparent
        }

        input[type=range]::-ms-fill-lower {
            background: #EFEFEF;
            border: 0 solid #EFEFEF;
            border-radius: 0
        }

        input[type=range]::-ms-fill-upper {
            background: #EFEFEF;
            border: 0 solid #EFEFEF;
            border-radius: 0
        }

        input[type=range]::-ms-thumb {
            border: 1px solid rgba(0, 0, 30, 0);
            height: 22px;
            width: 22px;
            border-radius: 50px;
            background: #ff3034;
            cursor: pointer;
            height: 2px
        }

        input[type=range]:focus::-ms-fill-lower {
            background: #EFEFEF
        }

        input[type=range]:focus::-ms-fill-upper {
            background: #363636
        }

        .switch {
            display: block;
            position: relative;
            line-height: 22px;
            font-size: 16px;
            height: 22px
        }

        .switch input {
            outline: 0;
            opacity: 0;
            width: 0;
            height: 0
        }

        .slider {
            width: 50px;
            height: 22px;
            border-radius: 22px;
            cursor: pointer;
            background-color: grey
        }

        .slider,
        .slider:before {
            display: inline-block;
            transition: .4s
        }

        .slider:before {
            position: relative;
            content: "";
            border-radius: 50%;
            height: 16px;
            width: 16px;
            left: 4px;
            top: 3px;
            background-color: #fff
        }

        input:checked+.slider {
            background-color: #ff3034
        }

        input:checked+.slider:before {
            -webkit-transform: translateX(26px);
            transform: translateX(26px)
        }

        select {
            border: 1px solid #363636;
            font-size: 14px;
            height: 22px;
            outline: 0;
            border-radius: 5px
        }

        .image-container {
            position: relative;
            min-width: 160px
        }

        .close {
            position: absolute;
            right: 5px;
            top: 5px;
            background: #ff3034;
            width: 16px;
            height: 16px;
            border-radius: 100px;
            color: #fff;
            text-align: center;
            line-height: 18px;
            cursor: pointer
        }

        .hidden {
            display: none
        }
    </style>
</head>

<body>
    <figure>
        <div id="stream-container" class="image-container hidden">
            <div class="close" id="close-stream">×</div>
            <img id="stream" src="">
        </div>
    </figure>



    <h1 style="color:green; font-size:5;">...GALLINERO LOS QUINTOS...</h1>




    <section class="main">
        <section id="buttons">
            <table>
                <tr>
                    <td><button id="get-still" style="text-align:center">IMAGEN</button></td>
                    <td></td>
                    <td><button id="toggle-stream" style="text-align:center">CAMARA</button></td>
                </tr>

                <tr>
                    <td></td>
                </tr>

                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                    <td style="text-align:center"><button id="forward"
                            onclick="fetch(document.location.origin+'/control?var=car&val=1');">ABRE</button></td>
                    <td></td>
                </tr>

                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>

                <tr>
                    <td></td>
                    <td style="text-align:center"><button id="backward"
                            onclick="fetch(document.location.origin+'/control?var=car&val=5');">CIERRA</button></td>
                <tr>
                    </td>
                </tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                </td>
                <tr>
                    </td>
                </tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>

                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>




                <tr>
                    <td>LUZ</td>
                    <td style="text-align:center" colspan="2"><input type="range" id="flash" min="0" max="255" value="0"
                            onchange="try{fetch(document.location.origin+'/control?var=flash&val='+this.value);}catch(e){}">
                    </td>
                </tr>
                <tr>
                    </td>
                </tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                </td>
                <tr>
                    </td>
                </tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td>CALIDAD</td>
                    <td style="text-align:center" colspan="2"><input type="range" id="quality" min="10" max="63"
                            value="10"
                            onchange="try{fetch(document.location.origin+'/control?var=quality&val='+this.value);}catch(e){}">
                    </td>
                </tr>




                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>



            </table>



        </section>
    </section>



    <p style="color:#FFFFFF; font-size:2">Exclusivo Para Ignacio Carrasco, by A.Del Río</p>


    <script>
        document.addEventListener('DOMContentLoaded', function () {
            function b(B) {
                let C;
                switch (B.type) {
                    case 'checkbox': C = B.checked ? 1 : 0;
                        break;
                    case 'range':
                    case 'select-one': C = B.value;
                        break;
                    case 'button':
                    case 'submit': C = '1';
                        break;
                    default: return;
                }
                const D = `${c}/control?var=${B.id}&val=${C}`;
                fetch(D).then(E => { console.log(`request to ${D} finished, status: ${E.status}`); })
            }
            var c = document.location.origin;
            const e = B => { B.classList.add('hidden') },
                f = B => { B.classList.remove('hidden') },
                g = B => {
                    B.classList.add('disabled'),
                        B.disabled = !0
                },
                h = B => { B.classList.remove('disabled'), B.disabled = !1 },
                i = (B, C, D) => {
                    D = !(null != D) || D;
                    let E;
                    'checkbox' === B.type ? (E = B.checked, C = !!C, B.checked = C) : (E = B.value, B.value = C),
                        D && E !== C ? b(B) : !D && ('aec' === B.id ? C ? e(v) : f(v) : 'agc' === B.id ? C ? (f(t), e(s)) : (e(t), f(s)) : 'awb_gain' === B.id ? C ? f(x) : e(x) : 'face_recognize' === B.id && (C ? h(n) : g(n)))
                };
            document.querySelectorAll('.close').forEach(B => { B.onclick = () => { e(B.parentNode) } }),
                fetch(`${c}/status`).then(function (B) { return B.json() }).then(function (B) { document.querySelectorAll('.default-action').forEach(C => { i(C, B[C.id], !1) }) });
            const j = document.getElementById('stream'),
                k = document.getElementById('stream-container'),
                l = document.getElementById('get-still'),
                m = document.getElementById('toggle-stream'),
                n = document.getElementById('face_enroll'),
                o = document.getElementById('close-stream'),
                p = () => {
                    window.stop(),
                        m.innerHTML = 'CAMARA'
                },
                q = () => {
                    j.src = `${c + ':8555'}/stream`,
                        f(k), m.innerHTML = 'DIRECTO'
                };
            l.onclick = () => {
                p(), j.src = `${c}/capture?_cb=${Date.now()}`,
                    f(k)
            },
                o.onclick = () => {
                    p(),
                        e(k)
                },
                m.onclick = () => {
                    const B = 'Stop Stream' === m.innerHTML;
                    B ? p() : q()
                },
                n.onclick = () => { b(n) },
                document.querySelectorAll('.default-action').forEach(B => { B.onchange = () => b(B) });
            const r = document.getElementById('agc'),
                s = document.getElementById('agc_gain-group'),
                t = document.getElementById('gainceiling-group');
            r.onchange = () => {
                b(r),
                    r.checked ? (f(t), e(s)) : (e(t), f(s))
            };
            const u = document.getElementById('aec'),
                v = document.getElementById('aec_value-group');
            u.onchange = () => {
                b(u),
                    u.checked ? e(v) : f(v)
            };
            const w = document.getElementById('awb_gain'),
                x = document.getElementById('wb_mode-group');
            w.onchange = () => {
                b(w),
                    w.checked ? f(x) : e(x)
            };
            const y = document.getElementById('face_detect'),
                z = document.getElementById('face_recognize'),
                A = document.getElementById('framesize');
            A.onchange = () => {
                b(A),
                    5 < A.value && (i(y, !1), i(z, !1))
            },
                y.onchange = () => {
                    return 5 < A.value ? (alert('Please select CIF or lower resolution before enabling this feature!'),
                        void i(y, !1)) : void (b(y), !y.checked && (g(n), i(z, !1)))
                },
                z.onchange = () => {
                    return 5 < A.value ? (alert('Please select CIF or lower resolution before enabling this feature!'),
                        void i(z, !1)) : void (b(z),
                            z.checked ? (h(n), i(y, !0)) : g(n))
                }
        });

    </script>
</body>

</html>
traté de separar las funciones del script para que sea más entendible, pero es mi amiga la que sabe de esta modalidad, a mí me confunde esta forma de script. También realicé algunas correcciones al HTML porque está con el formato del 5 pero usaba sintaxis del 4.
Voy a intentarlo
Pero como uso el conversor??, estoy perdio.
Que arduino uso?
Voy a intentarlo
Pero como uso el conversor??, estoy perdio.
Que arduino uso?
Vale ahora voy encaminado, he borrado el index.h y al arrancar el vonversor se genera uno nuevo
que entiendo que es el que incluye en el ino
Osea que si hago cambios en el html despues lo convierto en .h, probando estoy
Joe, lo que estoy aprendiendo, T
e lo Agradezco.
aduino2.11
Me arroja este error,
C:\Users\insec\Desktop\-gallinero0000\carmant\app_httpd.cpp:1:10: fatal error: dl_lib_matrix3d.h: No such file or directory
#include "dl_lib_matrix3d.h"
^~~~~~~~~~~~~~~~~~~
compilation terminated.

exit status 1

Compilation error: dl_lib_matrix3d.h: No such file or directory
 
Última edición:
Voy a intentarlo
Pero como uso el conversor??, estoy perdio.
Que arduino uso?
El Arduino pues la placa que estas utilizando, de tu código original no se modifica tanto, sacar el html me fue necesario porque me estaba dando error el compilador cuando estaba incrustado el literal, del conversor no tienes que hacer mucho, con darle clic al convertir.bat y esperar a que acabe basta, lo único que hará es que te tomará el archivo index.html y te genera el index.h para que en lugar de poner todo el static const char PROGMEM INDEX_HTML[] = R"rawliteral(.... y los posibles errores al editar el código, solo le pongas #include "index.h" y desde ahí se lee
INDEX_HTML ya so luego quieres agregar por ejemplo un icono o una imagen es que te puse el ejemplo del favicon.
 
Voy a intentarlo
Pero como uso el conversor??, estoy perdio.
Que arduino uso?

Vale ahora voy encaminado, he borrado el index.h y al arrancar el vonversor se genera uno nuevo
que entiendo que es el que incluye en el ino
Osea que si hago cambios en el html despues lo convierto en .h, probando estoy
Joe, lo que estoy aprendiendo, T
e lo Agradezco.
aduino2.11
Me arroja este error,
C:\Users\insec\Desktop\-gallinero0000\carmant\app_httpd.cpp:1:10: fatal error: dl_lib_matrix3d.h: No such file or directory
#include "dl_lib_matrix3d.h"
^~~~~~~~~~~~~~~~~~~
compilation terminated.

exit status 1

Compilation error: dl_lib_matrix3d.h: No such file or directory

con arduino 1.8.18
este:

Arduino:1.8.18 (Windows 10), Tarjeta:"AI Thinker ESP32-CAM, 240MHz (WiFi/BT), QIO, Huge APP (3MB No OTA/1MB SPIFFS), 80MHz, None, Disabled"

app_httpd.cpp:1:10: fatal error: dl_lib_matrix3d.h: No such file or directory

Se encontraron varias bibliotecas para "WiFi.h"

#include "dl_lib_matrix3d.h"

Usado: C:\Users\insec\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.11\libraries\WiFi

^~~~~~~~~~~~~~~~~~~

No usado: C:\Program Files (x86)\Arduino\libraries\WiFi

compilation terminated.

exit status 1

dl_lib_matrix3d.h: No such file or directory

Librería inválida encontrada en C:\Users\insec\Documents\Arduino\libraries\arduino_776683: No encontrado archivos de encabezado (.h) en C:\Users\insec\Documents\Arduino\libraries\arduino_776683

Librería inválida encontrada en C:\Users\insec\Documents\Arduino\libraries\WebServer_ESP32_ENC: No encontrado archivos de encabezado (.h) en C:\Users\insec\Documents\Arduino\libraries\WebServer_ESP32_ENC

Librería inválida encontrada en C:\Users\insec\Documents\Arduino\libraries\WiFiWebServer: No encontrado archivos de encabezado (.h) en C:\Users\insec\Documents\Arduino\libraries\WiFiWebServer
 
Es raro, no me causa problema.
1691001433351.png
¿cuál versión tienes en el gestor?
1691001557054.png
lo adjunto todo de nuevo por si acaso.
 

Adjuntos

  • carmant.zip
    86.5 KB · Visitas: 5
Es raro, no me causa problema.
Ver el archivo adjunto 302121
¿cuál versión tienes en el gestor?
Ver el archivo adjunto 302122
lo adjunto todo de nuevo por si acaso.
cuando abro el ino me arroja esto:
Librería inválida encontrada en C:\Users\insec\Documents\Arduino\libraries\arduino_776683: No encontrado archivos de encabezado (.h) en C:\Users\insec\Documents\Arduino\libraries\arduino_776683
Librería inválida encontrada en C:\Users\insec\Documents\Arduino\libraries\WebServer_ESP32_ENC: No encontrado archivos de encabezado (.h) en C:\Users\insec\Documents\Arduino\libraries\WebServer_ESP32_ENC
Librería inválida encontrada en C:\Users\insec\Documents\Arduino\libraries\WiFiWebServer: No encontrado archivos de encabezado (.h) en C:\Users\insec\Documents\Arduino\libraries\WiFiWebServer
 
¿originalmente como lo programaste?
esos archivos no deberían afectar, quizá instalaste mal alguna librería, pero no la ocupamos. En el gestor de tarjetas lo actualicé al 2.0.11 y al parecer la librería fue removida, verifica y cambia a la 1.0.6 para que pueda compilar.
 
¿originalmente como lo programaste?
esos archivos no deberían afectar, quizá instalaste mal alguna librería, pero no la ocupamos. En el gestor de tarjetas lo actualicé al 2.0.11 y al parecer la librería fue removida, verifica y cambia a la 1.0.6 para que pueda compilar.
El caso es con el primer Zip que enviaste si cagó bien y pude probar, solo le fallaba el vídeo, mañana lo revisaré todo y te cuento, gracias por Tu tiempo.
 
Me referia a que revises en el gestor
1691005271036.png
Porque si le diste clic a la notificación de actualizar y pasó a la versión 2 ya no funcionará.
 
Me referia a que revises en el gestor
Ver el archivo adjunto 302124
Porque si le diste clic a la notificación de actualizar y pasó a la versión 2 ya no funcionará.
Buenos dïas, al parecer se actualizarn las librerias, he vuelto a la 1.0.6 y si ha cargado dando estos errores:


El Sketch usa 887654 bytes (28%) del espacio de almacenamiento de programa. El máximo es 3145728 bytes.
Las variables Globales usan 52348 bytes (15%) de la memoria dinámica, dejando 275332 bytes para las variables locales. El máximo es 327680 bytes.
esptool.py v3.0-dev
Serial port COM7
Connecting......
Chip is ESP32-D0WD-V3 (revision 3)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: e0:5a:1b:6b:5e:08
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 8192 bytes to 47...
Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.0 seconds...
Hash of data verified.
Compressed 18656 bytes to 12053...
Writing at 0x00001000... (100 %)
Wrote 18656 bytes (12053 compressed) at 0x00001000 in 0.3 seconds (effective 478.4 kbit/s)...
Hash of data verified.
Compressed 887776 bytes to 485037...
Writing at 0x00010000... (3 %)
Writing at 0x00014000... (6 %)
Writing at 0x00018000... (10 %)
Writing at 0x0001c000... (13 %)
Writing at 0x00020000... (16 %)
Writing at 0x00024000... (20 %)
Writing at 0x00028000... (23 %)
Writing at 0x0002c000... (26 %)
Writing at 0x00030000... (30 %)
Writing at 0x00034000... (33 %)
Writing at 0x00038000... (36 %)
Writing at 0x0003c000... (40 %)
Writing at 0x00040000... (43 %)
Writing at 0x00044000... (46 %)
Writing at 0x00048000... (50 %)
Writing at 0x0004c000... (53 %)
Writing at 0x00050000... (56 %)
Writing at 0x00054000... (60 %)
Writing at 0x00058000... (63 %)
Writing at 0x0005c000... (66 %)
Writing at 0x00060000... (70 %)
Writing at 0x00064000... (73 %)
Writing at 0x00068000... (76 %)
Writing at 0x0006c000... (80 %)
Writing at 0x00070000... (83 %)
Writing at 0x00074000... (86 %)
Writing at 0x00078000... (90 %)
Writing at 0x0007c000... (93 %)
Writing at 0x00080000... (96 %)
Writing at 0x00084000... (100 %)
Wrote 887776 bytes (485037 compressed) at 0x00010000 in 13.5 seconds (effective 526.8 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 119...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (119 compressed) at 0x00008000 in 0.0 seconds (effective 1638.4 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
Librería inválida encontrada en C:\Users\insec\Documents\Arduino\libraries\arduino_776683: No encontrado archivos de encabezado (.h) en C:\Users\insec\Documents\Arduino\libraries\arduino_776683
Librería inválida encontrada en C:\Users\insec\Documents\Arduino\libraries\WebServer_ESP32_ENC: No encontrado archivos de encabezado (.h) en C:\Users\insec\Documents\Arduino\libraries\WebServer_ESP32_ENC
Librería inválida encontrada en C:\Users\insec\Documents\Arduino\libraries\WiFiWebServer: No encontrado archivos de encabezado (.h) en C:\Users\insec\Documents\Arduino\libraries\WiFiWebServer
 
Eso sería por tener mal los documentos dentro de la carpeta de Arduino pero no afecta, la compilación y carga fue bien al parecer, ¿sí te deja activar la cámara ahora que el html corrige el puerto al 8555?
 
Eso sería por tener mal los documentos dentro de la carpeta de Arduino pero no afecta, la compilación y carga fue bien al parecer, ¿sí te deja activar la cámara ahora que el html corrige el puerto al 8555?
De momento no abre la web

De momento no abre la web
No lo entiendo, he compilado la primera vez y si me aparece la ip 192.168.0.190 y el puerto 85 que es el que quiero poner aunque no abría la web.
Al revisar sin cambiar nada y cargar de nuevo a la cam me aparece así, no se de donde sale esa IP y prqué??
12:01:48.685 -> ssid: MIFI_B903
12:01:48.685 -> password: 12051205
12:01:59.794 -> Starting web server on port: '85'
12:01:59.794 -> Starting stream server on port: '86'
12:01:59.794 ->
12:01:59.794 -> WiFi disconnected
12:01:59.794 -> Camera Ready! Use 'http://192.168.4.1' to connect
12:02:01.294 -> RSSi: 0 dBm
Lo he intentado varias veces y siempre sale la misma IP.

ya he conseguido cargar varias veces si fallos aparentes, abre la web y funcionan botones y captura de imagen pero en camara el video no entra.
He cambiado el 81 por el 86 que es el que me da, quedando así:
13:01:54.450 ->
⸮ssid: MIFI_B903
13:01:54.778 -> password: 12051205
13:02:05.887 -> Starting web server on port: '85'
13:02:05.887 -> Starting stream server on port: '86'
13:02:05.887 ->
13:02:05.887 -> WiFi connected
13:02:05.887 -> Camera Ready! Use 'http://192.168.0.190' to connect
13:02:07.387 -> RSSi: 0 dBm

todo va bien menos video, ni siquiera en en la red interior, 192.168.0.190:85
ya he conseguido cargar varias veces si fallos aparentes, abre la web y funcionan botones y captura de imagen pero en camara el video no entra.
He cambiado el 81 por el 86 que es el que me da, quedando así:
13:01:54.450 ->
⸮ssid: MIFI_B903
13:01:54.778 -> password: 12051205
13:02:05.887 -> Starting web server on port: '85'
13:02:05.887 -> Starting stream server on port: '86'
13:02:05.887 ->
13:02:05.887 -> WiFi connected
13:02:05.887 -> Camera Ready! Use 'http://192.168.0.190' to connect
13:02:07.387 -> RSSi: 0 dBm

todo va bien menos video, ni siquiera en en la red interior, 192.168.0.190:85
esp32camahora está en esta ip:
lo que se ve son pilotos, si pica en abrir o cerrar y rapido a la imagen se veran encendidos

ya he conseguido cargar varias veces si fallos aparentes, abre la web y funcionan botones y captura de imagen pero en camara el video no entra.
He cambiado el 81 por el 86 que es el que me da, quedando así:
13:01:54.450 ->
⸮ssid: MIFI_B903
13:01:54.778 -> password: 12051205
13:02:05.887 -> Starting web server on port: '85'
13:02:05.887 -> Starting stream server on port: '86'
13:02:05.887 ->
13:02:05.887 -> WiFi connected
13:02:05.887 -> Camera Ready! Use 'http://192.168.0.190' to connect
13:02:07.387 -> RSSi: 0 dBm

todo va bien menos video, ni siquiera en en la red interior, 192.168.0.190:85

esp32camahora está en esta ip:
lo que se ve son pilotos, si pica en abrir o cerrar y rapido a la imagen se veran encendidos
Nada, si no se toca los de los puerto todo va bien, pero por el 80 no sirve, donde narices estára el problema?
 
EL tema es que si te carga la página pero no el video seguro que tenés mal la URL de acceso al canal de streaming... que ahora está en el puerto 86.
 
Con esto es con lo que estoy trabajando que Nuyel ha modificado amablemente, todo parece funcionar bien menos el botón cámara que debería abrir el video en directo.
CSS:
<!doctype html>

<html>

<head>

<meta charset="utf-8">

<meta name="viewport" content="width=device-width,initial-scale=1">

<title>GALLINERO</title>

<style>

body{font-family:Arial,Helvetica,sans-serif;background:#181818;color:#EFEFEF;font-size:16px}h2{font-size:18px}section.main{display:flex}#menu,section.main{flex-direction:column}#menu{display:none;flex-wrap:nowrap;min-width:340px;background:#363636;padding:8px;border-radius:4px;margin-top:-10px;margin-right:10px}#content{display:flex;flex-wrap:wrap;align-items:stretch}figure{padding:0;margin:0;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0}figure img{display:block;width:100%;height:auto;border-radius:4px;margin-top:8px}@media (min-width: 800px) and (orientation:landscape){#content{display:flex;flex-wrap:nowrap;align-items:stretch}figure img{display:block;max-width:100%;max-height:calc(100vh - 40px);width:auto;height:auto}figure{padding:0;margin:0;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0}}section#buttons{display:flex;flex-wrap:nowrap;justify-content:space-between}#nav-toggle{cursor:pointer;display:block}#nav-toggle-cb{outline:0;opacity:0;width:0;height:0}#nav-toggle-cb:checked+#menu{display:flex}.input-group{display:flex;flex-wrap:nowrap;line-height:22px;margin:5px 0}.input-group>label{display:inline-block;padding-right:10px;min-width:47%}.input-group input,.input-group select{flex-grow:1}.range-max,.range-min{display:inline-block;padding:0 5px}button{display:block;margin:5px;padding:0 12px;border:0;line-height:28px;cursor:pointer;color:#fff;background:#ff3034;border-radius:5px;font-size:16px;outline:0}button:hover{background:#ff494d}button:active{background:#f21c21}button.disabled{cursor:default;background:#a0a0a0}input[type=range]{-webkit-appearance:none;width:100%;height:22px;background:#363636;cursor:pointer;margin:0}input[type=range]:focus{outline:0}input[type=range]::-webkit-slider-runnable-track{width:100%;height:2px;cursor:pointer;background:#EFEFEF;border-radius:0;border:0 solid #EFEFEF}input[type=range]::-webkit-slider-thumb{border:1px solid rgba(0,0,30,0);height:22px;width:22px;border-radius:50px;background:#ff3034;cursor:pointer;-webkit-appearance:none;margin-top:-11.5px}input[type=range]:focus::-webkit-slider-runnable-track{background:#EFEFEF}input[type=range]::-moz-range-track{width:100%;height:2px;cursor:pointer;background:#EFEFEF;border-radius:0;border:0 solid #EFEFEF}input[type=range]::-moz-range-thumb{border:1px solid rgba(0,0,30,0);height:22px;width:22px;border-radius:50px;background:#ff3034;cursor:pointer}input[type=range]::-ms-track{width:100%;height:2px;cursor:pointer;background:0 0;border-color:transparent;color:transparent}input[type=range]::-ms-fill-lower{background:#EFEFEF;border:0 solid #EFEFEF;border-radius:0}input[type=range]::-ms-fill-upper{background:#EFEFEF;border:0 solid #EFEFEF;border-radius:0}input[type=range]::-ms-thumb{border:1px solid rgba(0,0,30,0);height:22px;width:22px;border-radius:50px;background:#ff3034;cursor:pointer;height:2px}input[type=range]:focus::-ms-fill-lower{background:#EFEFEF}input[type=range]:focus::-ms-fill-upper{background:#363636}.switch{display:block;position:relative;line-height:22px;font-size:16px;height:22px}.switch input{outline:0;opacity:0;width:0;height:0}.slider{width:50px;height:22px;border-radius:22px;cursor:pointer;background-color:grey}.slider,.slider:before{display:inline-block;transition:.4s}.slider:before{position:relative;content:"";border-radius:50%;height:16px;width:16px;left:4px;top:3px;background-color:#fff}input:checked+.slider{background-color:#ff3034}input:checked+.slider:before{-webkit-transform:translateX(26px);transform:translateX(26px)}select{border:1px solid #363636;font-size:14px;height:22px;outline:0;border-radius:5px}.image-container{position:relative;min-width:160px}.close{position:absolute;right:5px;top:5px;background:#ff3034;width:16px;height:16px;border-radius:100px;color:#fff;text-align:center;line-height:18px;cursor:pointer}.hidden{display:none}



</style>

</head>

<body>

<figure>

<div id="stream-container" class="image-container hidden">

<div class="close" id="close-stream">×</div>

<img id="stream" src="">

</div>

</figure>



<font color="gren"

<font size=5 >...GALLINERO  ...</font>




<section class="main">

<section id="buttons">

<table>

<tr><td align="center"><button id="get-still">IMAGEN</button></


<tr><td></td><td align="center"><button id="toggle-stream">CAMARA</button></

<tr><td>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td><td align="center"><button id="forward" onclick="fetch(document.location.origin+'/control?var=car&val=1');">ABRE</button></td><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td><td align="center"><button id="backward" onclick="fetch(document.location.origin+'/control?var=car&val=5');">CIERRA</button></td><tr></td></tr></td><tr></tr></td><tr></tr></td><tr></tr></td><tr></td></tr></td><tr></tr></td><tr></tr></td><tr></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>




<tr><td>LUZ</td><td align="center" colspan="2"><input type="range" id="flash" min="0" max="255" value="0" onchange="try{fetch(document.location.origin+'/control?var=flash&val='+this.value);}catch(e){}"></td></tr><tr></td></tr></td><tr></tr></td><tr></tr></td><tr></tr></td><tr></td></tr></td><tr></tr></td><tr></tr></td><tr></tr>

<tr><td></td></tr>

<tr><td>CALIDAD</td><td align="center" colspan="2"><input type="range" id="quality" min="10" max="63" value="10" onchange="try{fetch(document.location.origin+'/control?var=quality&val='+this.value);}catch(e){}"></td></tr>




<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>



</table>



</section>

</section>



<font color="#FFFFFF"

<font size=2 >(2023)</font>


<script>

document.addEventListener('DOMContentLoaded',function(){function b(B){let C;switch(B.type){case'checkbox':C=B.checked?1:0;break;case'range':case'select-one':C=B.value;break;case'button':case'submit':C='1';break;default:return;}const D=`${c}/control?var=${B.id}&val=${C}`;fetch(D).then(E=>{console.log(`request to ${D} finished, status: ${E.status}`)})}var c=document.location.origin;const e=B=>{B.classList.add('hidden')},f=B=>{B.classList.remove('hidden')},g=B=>{B.classList.add('disabled'),B.disabled=!0},h=B=>{B.classList.remove('disabled'),B.disabled=!1},i=(B,C,D)=>{D=!(null!=D)||D;let E;'checkbox'===B.type?(E=B.checked,C=!!C,B.checked=C):(E=B.value,B.value=C),D&&E!==C?b(B):!D&&('aec'===B.id?C?e(v):f(v):'agc'===B.id?C?(f(t),e(s)):(e(t),f(s)):'awb_gain'===B.id?C?f(x):e(x):'face_recognize'===B.id&&(C?h(n):g(n)))};document.querySelectorAll('.close').forEach(B=>{B.onclick=()=>{e(B.parentNode)}}),fetch(`${c}/status`).then(function(B){return B.json()}).then(function(B){document.querySelectorAll('.default-action').forEach(C=>{i(C,B[C.id],!1)})});const j=document.getElementById('stream'),k=document.getElementById('stream-container'),l=document.getElementById('get-still'),m=document.getElementById('toggle-stream'),n=document.getElementById('face_enroll'),o=document.getElementById('close-stream'),p=()=>{window.stop(),m.innerHTML='CAMARA'},q=()=>{j.src=`${c+':86'}/stream`,f(k),m.innerHTML='DIRECTO'};l.onclick=()=>{p(),j.src=`${c}/capture?_cb=${Date.now()}`,f(k)},o.onclick=()=>{p(),e(k)},m.onclick=()=>{const B='Stop Stream'===m.innerHTML;B?p():q()},n.onclick=()=>{b(n)},document.querySelectorAll('.default-action').forEach(B=>{B.onchange=()=>b(B)});const r=document.getElementById('agc'),s=document.getElementById('agc_gain-group'),t=document.getElementById('gainceiling-group');r.onchange=()=>{b(r),r.checked?(f(t),e(s)):(e(t),f(s))};const u=document.getElementById('aec'),v=document.getElementById('aec_value-group');u.onchange=()=>{b(u),u.checked?e(v):f(v)};const w=document.getElementById('awb_gain'),x=document.getElementById('wb_mode-group');w.onchange=()=>{b(w),w.checked?f(x):e(x)};const y=document.getElementById('face_detect'),z=document.getElementById('face_recognize'),A=document.getElementById('framesize');A.onchange=()=>{b(A),5<A.value&&(i(y,!1),i(z,!1))},y.onchange=()=>{return 5<A.value?(alert('Please select CIF or lower resolution before enabling this feature!'),void i(y,!1)):void(b(y),!y.checked&&(g(n),i(z,!1)))},z.onchange=()=>{return 5<A.value?(alert('Please select CIF or lower resolution before enabling this feature!'),void i(z,!1)):void(b(z),z.checked?(h(n),i(y,!0)):g(n))}});

</script>

</body>

</html>

Con esto es con lo que estoy trabajando que Nuyel ha modificado amablemente, todo parece funcionar bien menos el botón cámara que debería abrir el video en directo.
CSS:
<!doctype html>

<html>

<head>

<meta charset="utf-8">

<meta name="viewport" content="width=device-width,initial-scale=1">

<title>GALLINERO</title>

<style>

body{font-family:Arial,Helvetica,sans-serif;background:#181818;color:#EFEFEF;font-size:16px}h2{font-size:18px}section.main{display:flex}#menu,section.main{flex-direction:column}#menu{display:none;flex-wrap:nowrap;min-width:340px;background:#363636;padding:8px;border-radius:4px;margin-top:-10px;margin-right:10px}#content{display:flex;flex-wrap:wrap;align-items:stretch}figure{padding:0;margin:0;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0}figure img{display:block;width:100%;height:auto;border-radius:4px;margin-top:8px}@media (min-width: 800px) and (orientation:landscape){#content{display:flex;flex-wrap:nowrap;align-items:stretch}figure img{display:block;max-width:100%;max-height:calc(100vh - 40px);width:auto;height:auto}figure{padding:0;margin:0;-webkit-margin-before:0;margin-block-start:0;-webkit-margin-after:0;margin-block-end:0;-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:0;margin-inline-end:0}}section#buttons{display:flex;flex-wrap:nowrap;justify-content:space-between}#nav-toggle{cursor:pointer;display:block}#nav-toggle-cb{outline:0;opacity:0;width:0;height:0}#nav-toggle-cb:checked+#menu{display:flex}.input-group{display:flex;flex-wrap:nowrap;line-height:22px;margin:5px 0}.input-group>label{display:inline-block;padding-right:10px;min-width:47%}.input-group input,.input-group select{flex-grow:1}.range-max,.range-min{display:inline-block;padding:0 5px}button{display:block;margin:5px;padding:0 12px;border:0;line-height:28px;cursor:pointer;color:#fff;background:#ff3034;border-radius:5px;font-size:16px;outline:0}button:hover{background:#ff494d}button:active{background:#f21c21}button.disabled{cursor:default;background:#a0a0a0}input[type=range]{-webkit-appearance:none;width:100%;height:22px;background:#363636;cursor:pointer;margin:0}input[type=range]:focus{outline:0}input[type=range]::-webkit-slider-runnable-track{width:100%;height:2px;cursor:pointer;background:#EFEFEF;border-radius:0;border:0 solid #EFEFEF}input[type=range]::-webkit-slider-thumb{border:1px solid rgba(0,0,30,0);height:22px;width:22px;border-radius:50px;background:#ff3034;cursor:pointer;-webkit-appearance:none;margin-top:-11.5px}input[type=range]:focus::-webkit-slider-runnable-track{background:#EFEFEF}input[type=range]::-moz-range-track{width:100%;height:2px;cursor:pointer;background:#EFEFEF;border-radius:0;border:0 solid #EFEFEF}input[type=range]::-moz-range-thumb{border:1px solid rgba(0,0,30,0);height:22px;width:22px;border-radius:50px;background:#ff3034;cursor:pointer}input[type=range]::-ms-track{width:100%;height:2px;cursor:pointer;background:0 0;border-color:transparent;color:transparent}input[type=range]::-ms-fill-lower{background:#EFEFEF;border:0 solid #EFEFEF;border-radius:0}input[type=range]::-ms-fill-upper{background:#EFEFEF;border:0 solid #EFEFEF;border-radius:0}input[type=range]::-ms-thumb{border:1px solid rgba(0,0,30,0);height:22px;width:22px;border-radius:50px;background:#ff3034;cursor:pointer;height:2px}input[type=range]:focus::-ms-fill-lower{background:#EFEFEF}input[type=range]:focus::-ms-fill-upper{background:#363636}.switch{display:block;position:relative;line-height:22px;font-size:16px;height:22px}.switch input{outline:0;opacity:0;width:0;height:0}.slider{width:50px;height:22px;border-radius:22px;cursor:pointer;background-color:grey}.slider,.slider:before{display:inline-block;transition:.4s}.slider:before{position:relative;content:"";border-radius:50%;height:16px;width:16px;left:4px;top:3px;background-color:#fff}input:checked+.slider{background-color:#ff3034}input:checked+.slider:before{-webkit-transform:translateX(26px);transform:translateX(26px)}select{border:1px solid #363636;font-size:14px;height:22px;outline:0;border-radius:5px}.image-container{position:relative;min-width:160px}.close{position:absolute;right:5px;top:5px;background:#ff3034;width:16px;height:16px;border-radius:100px;color:#fff;text-align:center;line-height:18px;cursor:pointer}.hidden{display:none}



</style>

</head>

<body>

<figure>

<div id="stream-container" class="image-container hidden">

<div class="close" id="close-stream">×</div>

<img id="stream" src="">

</div>

</figure>



<font color="gren"

<font size=5 >...GALLINERO  ...</font>




<section class="main">

<section id="buttons">

<table>

<tr><td align="center"><button id="get-still">IMAGEN</button></


<tr><td></td><td align="center"><button id="toggle-stream">CAMARA</button></

<tr><td>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td><td align="center"><button id="forward" onclick="fetch(document.location.origin+'/control?var=car&val=1');">ABRE</button></td><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td><td align="center"><button id="backward" onclick="fetch(document.location.origin+'/control?var=car&val=5');">CIERRA</button></td><tr></td></tr></td><tr></tr></td><tr></tr></td><tr></tr></td><tr></td></tr></td><tr></tr></td><tr></tr></td><tr></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>




<tr><td>LUZ</td><td align="center" colspan="2"><input type="range" id="flash" min="0" max="255" value="0" onchange="try{fetch(document.location.origin+'/control?var=flash&val='+this.value);}catch(e){}"></td></tr><tr></td></tr></td><tr></tr></td><tr></tr></td><tr></tr></td><tr></td></tr></td><tr></tr></td><tr></tr></td><tr></tr>

<tr><td></td></tr>

<tr><td>CALIDAD</td><td align="center" colspan="2"><input type="range" id="quality" min="10" max="63" value="10" onchange="try{fetch(document.location.origin+'/control?var=quality&val='+this.value);}catch(e){}"></td></tr>




<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>

<tr><td></td></tr>



</table>



</section>

</section>



<font color="#FFFFFF"

<font size=2 >(2023)</font>


<script>

document.addEventListener('DOMContentLoaded',function(){function b(B){let C;switch(B.type){case'checkbox':C=B.checked?1:0;break;case'range':case'select-one':C=B.value;break;case'button':case'submit':C='1';break;default:return;}const D=`${c}/control?var=${B.id}&val=${C}`;fetch(D).then(E=>{console.log(`request to ${D} finished, status: ${E.status}`)})}var c=document.location.origin;const e=B=>{B.classList.add('hidden')},f=B=>{B.classList.remove('hidden')},g=B=>{B.classList.add('disabled'),B.disabled=!0},h=B=>{B.classList.remove('disabled'),B.disabled=!1},i=(B,C,D)=>{D=!(null!=D)||D;let E;'checkbox'===B.type?(E=B.checked,C=!!C,B.checked=C):(E=B.value,B.value=C),D&&E!==C?b(B):!D&&('aec'===B.id?C?e(v):f(v):'agc'===B.id?C?(f(t),e(s)):(e(t),f(s)):'awb_gain'===B.id?C?f(x):e(x):'face_recognize'===B.id&&(C?h(n):g(n)))};document.querySelectorAll('.close').forEach(B=>{B.onclick=()=>{e(B.parentNode)}}),fetch(`${c}/status`).then(function(B){return B.json()}).then(function(B){document.querySelectorAll('.default-action').forEach(C=>{i(C,B[C.id],!1)})});const j=document.getElementById('stream'),k=document.getElementById('stream-container'),l=document.getElementById('get-still'),m=document.getElementById('toggle-stream'),n=document.getElementById('face_enroll'),o=document.getElementById('close-stream'),p=()=>{window.stop(),m.innerHTML='CAMARA'},q=()=>{j.src=`${c+':86'}/stream`,f(k),m.innerHTML='DIRECTO'};l.onclick=()=>{p(),j.src=`${c}/capture?_cb=${Date.now()}`,f(k)},o.onclick=()=>{p(),e(k)},m.onclick=()=>{const B='Stop Stream'===m.innerHTML;B?p():q()},n.onclick=()=>{b(n)},document.querySelectorAll('.default-action').forEach(B=>{B.onchange=()=>b(B)});const r=document.getElementById('agc'),s=document.getElementById('agc_gain-group'),t=document.getElementById('gainceiling-group');r.onchange=()=>{b(r),r.checked?(f(t),e(s)):(e(t),f(s))};const u=document.getElementById('aec'),v=document.getElementById('aec_value-group');u.onchange=()=>{b(u),u.checked?e(v):f(v)};const w=document.getElementById('awb_gain'),x=document.getElementById('wb_mode-group');w.onchange=()=>{b(w),w.checked?f(x):e(x)};const y=document.getElementById('face_detect'),z=document.getElementById('face_recognize'),A=document.getElementById('framesize');A.onchange=()=>{b(A),5<A.value&&(i(y,!1),i(z,!1))},y.onchange=()=>{return 5<A.value?(alert('Please select CIF or lower resolution before enabling this feature!'),void i(y,!1)):void(b(y),!y.checked&&(g(n),i(z,!1)))},z.onchange=()=>{return 5<A.value?(alert('Please select CIF or lower resolution before enabling this feature!'),void i(z,!1)):void(b(z),z.checked?(h(n),i(y,!0)):g(n))}});

</script>

</body>

</html>
No se que puede pasar, con el puerto 80 todo va bien, incluso el video.
Solo cambio 80 por 85
config.server_port = 85;
Y en html, 81 por 86
'CAMARA'},q=()=>{j.src=`${c+':86'
El 86 es el puerto que me arroja en el terminal para el stream, compilo y cargo de nuevo en la cam y nada de nada.

No se que puede pasar, con el puerto 80 todo va bien, incluso el video.
Solo cambio 80 por 85
config.server_port = 85;
Y en html, 81 por 86
'CAMARA'},q=()=>{j.src=`${c+':86'
El 86 es el puerto que me arroja en el terminal para el stream, compilo y cargo de nuevo en la cam y nada de nada.
 

Adjuntos

  • app_httpd.zip
    13.6 KB · Visitas: 6
Última edición por un moderador:
Remarco que en el último código que intenté desglosar hay una sección donde se declara, dado a que está dentro del último script no es algo que pueda separar tan fácil para que lo puedas cambiar en el compilador.
Creo que entiendo el problema, cuando se usa el puerto 80 no pasa nada porque la dirección se resuelve como dirección_actual+:81+/stream
En el 80 como el puerto no se muestra queda como src="http://172.24.251.200:81/stream"
Pero modificamos el puerto y terminamos con la resolución en http://172.24.251.200:8554:8555/stream
:,D en resumen, hay que modificar el script
Te dejo una nueva versión del html que lo corrige

HTML:
<!doctype html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>GALLINER LOS QUINTOS</title>
    <style>
        body {
            font-family: Arial, Helvetica, sans-serif;
            background: #181818;
            color: #EFEFEF;
            font-size: 16px
        }

        h2 {
            font-size: 18px
        }

        section.main {
            display: flex
        }

        #menu,
        section.main {
            flex-direction: column
        }

        #menu {
            display: none;
            flex-wrap: nowrap;
            min-width: 340px;
            background: #363636;
            padding: 8px;
            border-radius: 4px;
            margin-top: -10px;
            margin-right: 10px
        }

        #content {
            display: flex;
            flex-wrap: wrap;
            align-items: stretch
        }

        figure {
            padding: 0;
            margin: 0;
            -webkit-margin-before: 0;
            margin-block-start: 0;
            -webkit-margin-after: 0;
            margin-block-end: 0;
            -webkit-margin-start: 0;
            margin-inline-start: 0;
            -webkit-margin-end: 0;
            margin-inline-end: 0
        }

        figure img {
            display: block;
            width: 100%;
            height: auto;
            border-radius: 4px;
            margin-top: 8px
        }

        @media (min-width: 800px) and (orientation:landscape) {
            #content {
                display: flex;
                flex-wrap: nowrap;
                align-items: stretch
            }

            figure img {
                display: block;
                max-width: 100%;
                max-height: calc(100vh - 40px);
                width: auto;
                height: auto
            }

            figure {
                padding: 0;
                margin: 0;
                -webkit-margin-before: 0;
                margin-block-start: 0;
                -webkit-margin-after: 0;
                margin-block-end: 0;
                -webkit-margin-start: 0;
                margin-inline-start: 0;
                -webkit-margin-end: 0;
                margin-inline-end: 0
            }
        }

        section#buttons {
            display: flex;
            flex-wrap: nowrap;
            justify-content: space-between
        }

        #nav-toggle {
            cursor: pointer;
            display: block
        }

        #nav-toggle-cb {
            outline: 0;
            opacity: 0;
            width: 0;
            height: 0
        }

        #nav-toggle-cb:checked+#menu {
            display: flex
        }

        .input-group {
            display: flex;
            flex-wrap: nowrap;
            line-height: 22px;
            margin: 5px 0
        }

        .input-group>label {
            display: inline-block;
            padding-right: 10px;
            min-width: 47%
        }

        .input-group input,
        .input-group select {
            flex-grow: 1
        }

        .range-max,
        .range-min {
            display: inline-block;
            padding: 0 5px
        }

        button {
            display: block;
            margin: 5px;
            padding: 0 12px;
            border: 0;
            line-height: 28px;
            cursor: pointer;
            color: #fff;
            background: #ff3034;
            border-radius: 5px;
            font-size: 16px;
            outline: 0
        }

        button:hover {
            background: #ff494d
        }

        button:active {
            background: #f21c21
        }

        button.disabled {
            cursor: default;
            background: #a0a0a0
        }

        input[type=range] {
            -webkit-appearance: none;
            width: 100%;
            height: 22px;
            background: #363636;
            cursor: pointer;
            margin: 0
        }

        input[type=range]:focus {
            outline: 0
        }

        input[type=range]::-webkit-slider-runnable-track {
            width: 100%;
            height: 2px;
            cursor: pointer;
            background: #EFEFEF;
            border-radius: 0;
            border: 0 solid #EFEFEF
        }

        input[type=range]::-webkit-slider-thumb {
            border: 1px solid rgba(0, 0, 30, 0);
            height: 22px;
            width: 22px;
            border-radius: 50px;
            background: #ff3034;
            cursor: pointer;
            -webkit-appearance: none;
            margin-top: -11.5px
        }

        input[type=range]:focus::-webkit-slider-runnable-track {
            background: #EFEFEF
        }

        input[type=range]::-moz-range-track {
            width: 100%;
            height: 2px;
            cursor: pointer;
            background: #EFEFEF;
            border-radius: 0;
            border: 0 solid #EFEFEF
        }

        input[type=range]::-moz-range-thumb {
            border: 1px solid rgba(0, 0, 30, 0);
            height: 22px;
            width: 22px;
            border-radius: 50px;
            background: #ff3034;
            cursor: pointer
        }

        input[type=range]::-ms-track {
            width: 100%;
            height: 2px;
            cursor: pointer;
            background: 0 0;
            border-color: transparent;
            color: transparent
        }

        input[type=range]::-ms-fill-lower {
            background: #EFEFEF;
            border: 0 solid #EFEFEF;
            border-radius: 0
        }

        input[type=range]::-ms-fill-upper {
            background: #EFEFEF;
            border: 0 solid #EFEFEF;
            border-radius: 0
        }

        input[type=range]::-ms-thumb {
            border: 1px solid rgba(0, 0, 30, 0);
            height: 22px;
            width: 22px;
            border-radius: 50px;
            background: #ff3034;
            cursor: pointer;
            height: 2px
        }

        input[type=range]:focus::-ms-fill-lower {
            background: #EFEFEF
        }

        input[type=range]:focus::-ms-fill-upper {
            background: #363636
        }

        .switch {
            display: block;
            position: relative;
            line-height: 22px;
            font-size: 16px;
            height: 22px
        }

        .switch input {
            outline: 0;
            opacity: 0;
            width: 0;
            height: 0
        }

        .slider {
            width: 50px;
            height: 22px;
            border-radius: 22px;
            cursor: pointer;
            background-color: grey
        }

        .slider,
        .slider:before {
            display: inline-block;
            transition: .4s
        }

        .slider:before {
            position: relative;
            content: "";
            border-radius: 50%;
            height: 16px;
            width: 16px;
            left: 4px;
            top: 3px;
            background-color: #fff
        }

        input:checked+.slider {
            background-color: #ff3034
        }

        input:checked+.slider:before {
            -webkit-transform: translateX(26px);
            transform: translateX(26px)
        }

        select {
            border: 1px solid #363636;
            font-size: 14px;
            height: 22px;
            outline: 0;
            border-radius: 5px
        }

        .image-container {
            position: relative;
            min-width: 160px
        }

        .close {
            position: absolute;
            right: 5px;
            top: 5px;
            background: #ff3034;
            width: 16px;
            height: 16px;
            border-radius: 100px;
            color: #fff;
            text-align: center;
            line-height: 18px;
            cursor: pointer
        }

        .hidden {
            display: none
        }
    </style>
</head>

<body>
    <figure>
        <div id="stream-container" class="image-container hidden">
            <div class="close" id="close-stream">×</div>
            <img id="stream" src="">
        </div>
    </figure>

    <h1 style="color:green; font-size:5;">...GALLINERO LOS QUINTOS...</h1>

    <section class="main">
        <section id="buttons">
            <table>
                <tr>
                    <td><button id="get-still" style="text-align:center">IMAGEN</button></td>
                    <td></td>
                    <td><button id="toggle-stream" style="text-align:center">CAMARA</button></td>
                </tr>

                <tr>
                    <td></td>
                </tr>

                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                    <td style="text-align:center"><button id="forward"
                            onclick="fetch(document.location.origin+'/control?var=car&val=1');">ABRE</button></td>
                    <td></td>
                </tr>

                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>

                <tr>
                    <td></td>
                    <td style="text-align:center"><button id="backward"
                            onclick="fetch(document.location.origin+'/control?var=car&val=5');">CIERRA</button></td>
                <tr>
                    </td>
                </tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                </td>
                <tr>
                    </td>
                </tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>

                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>

                <tr>
                    <td>LUZ</td>
                    <td style="text-align:center" colspan="2"><input type="range" id="flash" min="0" max="255" value="0"
                            onchange="try{fetch(document.location.origin+'/control?var=flash&val='+this.value);}catch(e){}">
                    </td>
                </tr>
                <tr>
                    </td>
                </tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                </td>
                <tr>
                    </td>
                </tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                </td>
                <tr></tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td>CALIDAD</td>
                    <td style="text-align:center" colspan="2"><input type="range" id="quality" min="10" max="63"
                            value="10"
                            onchange="try{fetch(document.location.origin+'/control?var=quality&val='+this.value);}catch(e){}">
                    </td>
                </tr>

                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>
                <tr>
                    <td></td>
                </tr>



            </table>



        </section>
    </section>



    <p style="color:#FFFFFF; font-size:2">Exclusivo Para Ignacio Carrasco, by A.Del Río</p>


    <script>
        document.addEventListener('DOMContentLoaded', function () {
            function b(B) {
                let C;
                switch (B.type) {
                    case 'checkbox': C = B.checked ? 1 : 0;
                        break;
                    case 'range':
                    case 'select-one': C = B.value;
                        break;
                    case 'button':
                    case 'submit': C = '1';
                        break;
                    default: return;
                }
                const D = `${c}/control?var=${B.id}&val=${C}`;
                fetch(D).then(E => { console.log(`request to ${D} finished, status: ${E.status}`); })
            }
            var c = document.location.origin;
            var pS = document.location.port;
            var camPort = parseInt(document.location.port) + 1; // Puerto personalizado que deseas usar
            var camDir = c.replace(`:${pS}`,``);
            const e = B => { B.classList.add('hidden') },
                f = B => { B.classList.remove('hidden') },
                g = B => {
                    B.classList.add('disabled'),
                        B.disabled = !0
                },
                h = B => { B.classList.remove('disabled'), B.disabled = !1 },
                i = (B, C, D) => {
                    D = !(null != D) || D;
                    let E;
                    'checkbox' === B.type ? (E = B.checked, C = !!C, B.checked = C) : (E = B.value, B.value = C),
                        D && E !== C ? b(B) : !D && ('aec' === B.id ? C ? e(v) : f(v) : 'agc' === B.id ? C ? (f(t), e(s)) : (e(t), f(s)) : 'awb_gain' === B.id ? C ? f(x) : e(x) : 'face_recognize' === B.id && (C ? h(n) : g(n)))
                };
            document.querySelectorAll('.close').forEach(B => { B.onclick = () => { e(B.parentNode) } }),
                fetch(`${c}/status`).then(function (B) { return B.json() }).then(function (B) { document.querySelectorAll('.default-action').forEach(C => { i(C, B[C.id], !1) }) });
            const j = document.getElementById('stream'),
                k = document.getElementById('stream-container'),
                l = document.getElementById('get-still'),
                m = document.getElementById('toggle-stream'),
                n = document.getElementById('face_enroll'),
                o = document.getElementById('close-stream'),
                p = () => {
                    window.stop(),
                        m.innerHTML = 'CAMARA'
                },
                q = () => {
                    j.src = `${camDir}:${camPort}/stream`,
                        f(k), m.innerHTML = 'DIRECTO'
                };
            l.onclick = () => {
                p(), j.src = `${c}/capture?_cb=${Date.now()}`,
                    f(k)
            },
                o.onclick = () => {
                    p(),
                        e(k)
                },
                m.onclick = () => {
                    const B = 'Stop Stream' === m.innerHTML;
                    B ? p() : q()
                },
                n.onclick = () => { b(n) },
                document.querySelectorAll('.default-action').forEach(B => { B.onchange = () => b(B) });
            const r = document.getElementById('agc'),
                s = document.getElementById('agc_gain-group'),
                t = document.getElementById('gainceiling-group');
            r.onchange = () => {
                b(r),
                    r.checked ? (f(t), e(s)) : (e(t), f(s))
            };
            const u = document.getElementById('aec'),
                v = document.getElementById('aec_value-group');
            u.onchange = () => {
                b(u),
                    u.checked ? e(v) : f(v)
            };
            const w = document.getElementById('awb_gain'),
                x = document.getElementById('wb_mode-group');
            w.onchange = () => {
                b(w),
                    w.checked ? f(x) : e(x)
            };
            const y = document.getElementById('face_detect'),
                z = document.getElementById('face_recognize'),
                A = document.getElementById('framesize');
            A.onchange = () => {
                b(A),
                    5 < A.value && (i(y, !1), i(z, !1))
            },
                y.onchange = () => {
                    return 5 < A.value ? (alert('Please select CIF or lower resolution before enabling this feature!'),
                        void i(y, !1)) : void (b(y), !y.checked && (g(n), i(z, !1)))
                },
                z.onchange = () => {
                    return 5 < A.value ? (alert('Please select CIF or lower resolution before enabling this feature!'),
                        void i(z, !1)) : void (b(z),
                            z.checked ? (h(n), i(y, !0)) : g(n))
                }
        });

    </script>
</body>

</html>
Al menos en la prueba que hice ya lo reemplaza correctamente
1691086558211.png
El script primero analiza si al consultar c este también incluye el puerto y remueve el texto para que al generarse la nueva url no cause conflicto, también módica el puerto al que quieras cambiar la cámara con esa nueva variable camPort para que coincida con el puerto que usa el programa de Arduino.

Si se pone var camPort = parseInt(document.location.port) + 1; debería coincidir por la línea de Arduino config.server_port += 1; pero ya dependerá de que tengas dicho puerto abierto o si ocupas pasarlo a otro o si lo dejas en camPort = 8554 y usas el 85 para el http, en tal caso recuerda también corregir la línea en Arduino a un puerto específico.
 
Última edición:
FUNCIONAAAAAAAAAAAAAA,
81.38.179.177:85
http://81.38.179.177:85
ojo que la web abre pero el video solo admite un usuario
Tio eres una máquina, no sabes cuanto agradezco al Hilo y a Ti en particular, MUCHAS GRACIAS.
FUNCIONAAAAAAAAAAAAAA,
81.38.179.177:85
http://81.38.179.177:85
ojo que la web abre pero el video solo admite un usuario
Joder Tio eres una maquina, no sabes cuanto agradezco al Hilo y a Ti en particular, MUCHAS GRACIAS.

Lo he cambiado en los dos sitios por 85 y 86
Son los que me han abierto.
Muchas Gracias.
Parece que tiene posibilidades este modulo, no?
acabaste de ver?, para renovar la ip
 
Última edición:
Atrás
Arriba